Completion handler în main thread

De fapt, vreau să am content-ul de la JSON-ul de twitter afișat atunci cănd rulez aplicația.
Cu secvența de mai jos – trebuie sa dau click

dispatch_async(dispatch_get_main_queue(), ^{
// NSURLSession – model prima faza
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSError *jsonParsingError = nil;
NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParsingError];
//din JSON in NSDictionary doar itemul STATUSES
self.results = jsonResults[@”statuses”];
[self.tableView reloadData];

}];
[dataTask resume];
});

De ce?
Pentru că UI-ul trebuie să fie actualizat doar din main thread. Dacă testez cu [[NSThread currentThread] isMainThread], aflu că nu sunt în main thread.
Așa că modific codul astfel:


[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSError *jsonParsingError = nil;
NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParsingError];
if (jsonParsingError)
{
NSLog(@”Eroare la JSON=%@”, jsonParsingError);
}
self.results = jsonResults[@”statuses”];
//din JSON in NSDictionary doar itemul STATUSES
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
if ([[NSThread currentThread] isMainThread]){
NSLog(@”Sunt in main thread”);
}
else{
NSLog(@”Nu sunt in main thread”);
}
});
}];
[dataTask resume];

În acest moment aplicația funcționează perfect.

Share Button

Stefan

Leave a Reply

Your email address will not be published.