- (void)update { // ... //TU JEST SPRAWDZANE CZY UPDATE JEST INNY. JEŚLI DOTYCZY TEGO SAMEGO, METODA JEST PRZERYWANA return; // ... // Przerwij działający update jeśli jakiś trwa UIApplication *application = [UIApplication sharedApplication]; [application endBackgroundTask:updateBackgroundTaskIdentifier]; // Przygotuj funkcję wywołaną jeśli minie czas na wykonanie update'u updateBackgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ [application endBackgroundTask:updateBackgroundTaskIdentifier]; updateBackgroundTaskIdentifier = UIBackgroundTaskInvalid; }]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Wyślij zapytanie do serwera. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self.currentServerAddress stringByAppendingString:@"/GetPointsOfInterest.php"]] cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:30]; NSString *requestBodyString = [NSString stringWithFormat:@"from=%@&to=%@", sectorNameFrom, sectorNameTo]; request.HTTPMethod = @"POST"; request.HTTPBody = [requestBodyString dataUsingEncoding:NSUTF8StringEncoding]; //self.getPointsOfInterestConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; // Wcześniej pobieranie odbywało się asynchronicznie, ale teraz skoro mam nowy wątek uznałem, że powinienem w nim użyć metody synchronicznej. NSURLResponse *response = nil; NSError *error = nil; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSLog(@"%@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]); // tu będzie przetwarzanie otrzymanych danych. [application endBackgroundTask:updateBackgroundTaskIdentifier]; updateBackgroundTaskIdentifier = UIBackgroundTaskInvalid; }); }
No i teraz czy taki sposób będzie działał poprawnie? Tzn. czy będzie działać niezależnie od tego czy aplikacja jest uruchomiona czy w tle? Oraz jeśli coś wywoła metodę update podczas trwania innego pobierania, to czy ta metoda zostanie przerwana w miejscu: NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; i wywołana ponownie? O czymś jeszcze powinienem wiedzieć?