L'exécution de la tâche dans le thread d'arrière-plan périodiquement dans iOS

Je suis un nouveau dans iOS. Je suis en train de travailler sur l'application doit exécuter une tâche pour l'obtention de données de Serveur dans le thread d'arrière-plan que je ne veux pas bloquer l'INTERFACE utilisateur dans le thread principal. Cette tâche prend beaucoup de temps, j'ai essayé d'utiliser le NSTimer mais il est toujours verrouiller l'INTERFACE utilisateur. Ma tâche est de vérifier les nouveaux messages dans le Chat de l'écran, j'ai besoin d'appeler cette tâche toutes les 5s. Si j'utilise NSTimer, lorsque la saisie de texte , le texte semble se figer un instant, le temps de cette tâche est la scène. Est-il possible de traiter cette tâche sans verrouillage de l'INTERFACE utilisateur. Merci de me donner quelques conseils. Merci beaucoup.

== CODE DE MISE À JOUR ==

 - (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];
}
});
});
}
  • Je suis désolé. Je ne peux pas vous donner une réponse à la question. Mais je peux juste dire que l'utilisation d'un NSTimer pour appeler une tâche toutes les 5s est coûteuse en termes de ressources et dont je n'ai pas de conseils à vous de le faire!
  • Merci. Avez-vous une solution meilleure qu'elle?
  • Je ne suis pas sûr de savoir pourquoi vous pensez NSTimer gourmande en ressources. Avez-vous des références? Ou êtes-vous simplement en se référant à l'idée de faire quelque chose une fois toutes les 5 secondes?
  • Je sais que ce post est vieux, mais avez-vous réussi à régler ce problème?
InformationsquelleAutor NTNT | 2014-09-19