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];
}
});
});
}
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
@eliasah: Dzięki. Czy masz jakieś lepsze rozwiązanie? – NTNT
@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? –