Ich verwende den folgenden Code zu führen, was ich eine Hintergrundsynchronisation sein möchte, aber der Haupt-Thread verlangsamt oder sogar zum Stillstand kommt, wenn der Json empfangen ist größer als 20 oder also Aufzeichnungen. Gibt es etwas Falsches an diesem Code für eine Hintergrundoperation? Was könnte den Hauptthread blockieren? Vielen Dank für Anregungen.IOS: Haupt-Thread verlangsamt während Hintergrund-Betrieb
Hinweis: Es gibt eine auskommentierte Zeile unterhalb von performSelectorOnMainThread, wo die App die JSON-Verarbeitung verarbeitet, die ich in einen weiteren Hintergrund-Thread geändert habe, aber die Änderung scheint nicht zu helfen.
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#define kProductsURL [NSURL URLWithString: @"http://~/getproducts.php"]
//in viewDidLoad
if(hasInternet==YES && [loggedIntoServer isEqual:@1]) {
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: kProductsURL];
//previous line grabed data from api.
if (data) {
// [self performSelectorOnMainThread:@selector(fetchData:) withObject:data waitUntilDone:YES];//no longer doing this on main thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self fetchData:data];
});
}
});
;
} //close hasInternet, logged into server.
- (void)fetchData:(NSData *)jsonFeed {
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:jsonFeed
options:kNilOptions
error:&error];
NSMutableArray* latestProducts = [[NSMutableArray alloc] init];
//this is specific to format of JSON
if (![[json objectForKey:@“products"] isKindOfClass:[NSNull class]]) {
latestProducts = [[json objectForKey:@“products"]mutableCopy];
getProducts = latestProducts;
int size = [latestProducts count];
[self.tableView reloadData];
getProducts = [self convertFeedtoObject:latestProducts];
[self importAndSaveProducts:getProducts];//this imports and saves
self.recentlySynced=YES;
}
}
wo ist das Hauptgewinde? –
dispatch_get_global_queue ist kein Hauptthread !!! –
Ich bin neugierig, was Ihre 'fetchData:' Methode tut. Und wie Sie 'kBgQueue' erstellen – marosoaie