/ / Ausführen einer Aufgabe im Hintergrund Thread in regelmäßigen Abständen in iOS - IOS, Ziel-C, Multithreading, Hintergrund-Prozess

Eine Aufgabe im Hintergrund regelmäßig in iOS ausführen - ios, objective-c, multithreading, background-process

Ich bin neu in iOS. Ich arbeite an der App muss eine Aufgabe ausführen, um Daten von Server im Hintergrund Thread zu bekommen, wie ich nicht die Benutzeroberfläche im Haupt-Thread sperren möchte. Diese Aufgabe wird eine lange Zeit dauern, ich habe versucht, den NSTimer zu verwenden, aber es ist immer noch die Benutzeroberfläche sperren. Meine Aufgabe ist es, neue Nachrichten im Chat-Bildschirm zu überprüfen, ich muss diese Aufgabe alle 5s aufrufen. Wenn ich NSTimer benutze, scheint der Text beim Eingeben von Text einen Moment einzufrieren, während diese Aufgabe ausgeführt wird. Gibt es eine Möglichkeit, diese Aufgabe ohne Sperr-UI zu verarbeiten? Bitte geben Sie mir einige Ratschläge. Vielen Dank.

== AKTUALISIERUNGSCODE ==

 - (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];
}

});
});
}

Antworten:

34 für die Antwort № 1

Das Planen der Aufgabe mit einem NSTimer ist in der Tat der richtige Weg. Sie müssen nur sicherstellen, dass Sie Ihren schweren Nicht-UI-Code in einem Hintergrundthread ausführen. Hier ist ein Beispiel

- (void)viewDidLoad {
[super viewDidLoad];
[self startTimedTask];
}

- (void)startTimedTask
{
NSTimer *fiveSecondTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(performBackgroundTask) userInfo:nil repeats:YES];
}

- (void)performBackgroundTask
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Do background work
dispatch_async(dispatch_get_main_queue(), ^{
//Update UI
});
});
}

14 für die Antwort № 2
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates
});
});

Versuche dies