2014-09-19 11 views
17

Jestem nowym użytkownikiem iOS. Pracuję nad aplikacją, aby uruchomić zadanie pobierania danych z serwera w wątku w tle, ponieważ nie chcę blokować interfejsu w głównym wątku. Zadanie to zajmie dużo czasu, próbowałem używać NSTimer, ale nadal blokuje interfejs użytkownika. Moim zadaniem jest sprawdzenie nowych wiadomości na ekranie czatu, muszę wywołać to zadanie co 5 sekund. Jeśli używam NSTimer, gdy tekst wejściowy, tekst wydaje się zamarzać na chwilę podczas wykonywania tego zadania. Czy istnieje sposób na przetwarzanie tego zadania bez blokady interfejsu użytkownika. Proszę, udziel mi rad. Dzięki wielkie.Uruchamianie zadania w wątku w tle okresowo w iOS

== KOD UPDATE ==

- (void)performBackgroundTask 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //Do background work 

     if([[NSUserDefaults standardUserDefaults] boolForKey:@"LoggedIn"]) { 
      NSDictionary * userDictionary = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"SessionDictionary"]; 

      NSString *authenKey= [userDictionary valueForKey:@"authToken"]; 

      NSString* limit = @"1000"; 

      [[LSDataManager sharedDataManager] getLatestMessagesWithAuthKey:authenKey andLimit:limit withBlock:^ (NSDictionary* responseDict) 
      { 
       if (responseDict) { 
        [self loadDataFromServer:responseDict]; 

        NSArray* lastMessageArray= nil; 

        //filter message data 
        if (self.MessagesArray.count >0) { 

         if (!self.isSeller) { 

          lastMessageArray = [self filterMessageData:self.MessagesArray withProductID:self.productID withSellerID:self.receiverID withBuyerID:self.senderID]; 
         } 
         else 
         { 
          lastMessageArray = [self filterMessageData:self.MessagesArray withProductID:self.productID withSellerID:self.senderID withBuyerID:self.receiverID]; 
         } 

         NSLog(@"filter array %@",lastMessageArray); 

         if([lastMessageArray count] >0){ 
          //[self loadMessages:lastMessageArray]; 
          if (self.TempdataSource == nil) { 
           self.TempdataSource = [NSMutableArray array]; 
          } 
          else 
          { 
           [self.TempdataSource removeAllObjects]; 
          } 

          self.TempdataSource = [[[ContentManager sharedManager] generateConversation:lastMessageArray withSenderID:self.senderID] mutableCopy]; 

         } 
        } 
       } 
      }]; 
     } 


     dispatch_async(dispatch_get_main_queue(), ^{ 
      //Update UI 

      //compare 2 arrays 
      if ([self.TempdataSource count] == [self.dataSource count]) { 
       NSLog(@"both are same"); 
      } 
      else{ 
       NSLog(@"both are different"); 
       self.dataSource = [self.TempdataSource mutableCopy]; 

       [self refreshMessages]; 
      } 

     }); 
    }); 
} 
+0

Przykro mi. Nie mogę dać ci odpowiedzi na twoje pytanie. Ale mogę tylko powiedzieć, że używanie NSTimer do wywoływania zadania co 5 sekund jest zasobochłonne i nie radzę ci tego robić! – eliasah

+0

@eliasah: Dzięki. Czy masz jakieś lepsze rozwiązanie? – NTNT

+0

@eliasah Nie jestem pewien, dlaczego uważasz, że NSTimer jest zasobochłonny. Czy masz jakieś referencje? A może chodzi ci o pomysł zrobienia czegoś raz na 5 sekund? –

Odpowiedz

13
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
    //Background Thread 
    dispatch_async(dispatch_get_main_queue(), ^(void){ 
     //Run UI Updates 
    }); 
}); 

Spróbuj

+0

Dzięki za szybką odpowiedź. Próbowałem, ale wciąż jest ten sam – NTNT

34

Planowanie zadania przy użyciu NSTimer jest rzeczywiście właściwa droga. Musisz tylko upewnić się, że używasz ciężkiego kodu spoza UI w wątku w tle. Oto przykład:

+0

Dzięki, ale słyszałem, że jeśli użycie NSTimer nie jest dobre, prawda? Przepraszam, że jestem nowicjuszem w IOS, chcę tylko zrozumieć więcej. – NTNT

+0

Czy możesz dodać odniesienie do miejsca, w którym to usłyszałeś? – Stavash

+0

@Stavash Powiedziałem, że NSTimer do aktywnego zadania jest zasobochłonny. Nie powiedziałem, że nie jest dobrze. Ale całkowicie zgadzam się z rozwiązaniem, które dałeś +1. – eliasah