Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

- - - - -

Multitasking, pobieranie w tle. Czy robię to dobrze?


  • Zaloguj się, aby dodać odpowiedź
Brak odpowiedzi do tego tematu

#1 Gość_oneghost_*

Gość_oneghost_*

Napisano 30 października 2013 - 11:04

Piszę program, który czasem będzie pobierał dane z internetu, nawet jeśli jest w tle. Chciałem zapytać czy dobrze do tego podchodzę, bo nigdy wcześniej tego nie robiłem. Mam funkcję - (void)update, która jest wywoływana przez pewne zdarzenia w różnych momentach. Funkcja ta ma sprawdzić czy update jest inny niż aktualnie trwający (jeśli jakiś trwa), przerwać trwający w takim przypadku i rozpocząć pobierania danych z internetu.

- (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ć?




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych