Мне нужно выполнить синхронизацию с сервером, когда мое приложение запущено. Иногда эта синхронизация может занять несколько минут. На iPhone эта задача прерывается, если пользователь нажимает кнопку «домой» или если устройство автоматически блокируется.iOS Фоновый процесс
Я пытался что-то вроде:
backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
backgroundTaskID = UIBackgroundTaskInvalid;
}];
[self Synchronization];
funcao sincronização:
-(void)Synchronization{
object=nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[TheAppDelegate setSync:YES];
send = NO;
responseObj = [[ConteinerInicial alloc] init];
object = [self fillObjectContainer:1];
error = NO;
[[objectManager HTTPClient] setDefaultHeader:@"Token" value:TheAppDelegate.token.token];
[[objectManager HTTPClient] setDefaultHeader:@"Username" value:TheAppDelegate.token.userName];
[[objectManager HTTPClient] setDefaultHeader:@"IDDevice" value:TheAppDelegate.token.IDDevice];
[objectManager postObject:object path:@"" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result){
NSArray *response = [result array];
NSLog(@"Loading mapping result: %@", result);
NSDictionary *headerDictionary = [operation.HTTPRequestOperation.response allHeaderFields];
NSString *authenticationStatus = [headerDictionary objectForKey:@"AuthenticationStatus"];
// if server returns "NotAuthorized", user must login again
if ([authenticationStatus isEqualToString:@"NotAuthorized"]) {
[AppDelegate showErrorAlert:@"Login expired!"];
[TheAppDelegate clearLoginToken];
error = YES;
return;
}
responseObj = [response objectAtIndex:0];
if(responseObj.Package.count>0)
{
[self savePackage:responseObj tipo:1];
[self Synchronization];
}else
{
[[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
backgroundTaskID = UIBackgroundTaskInvalid;
}
} failure: ^(RKObjectRequestOperation *operation, NSError *reportError){
RKLogError(@"Operation failed with error: %@", reportError);
[AppDelegate showErrorAlert:@"There is some problem with the connection or the server! Please, check your connection or the address of the server and try again."];
send = YES;
[TheAppDelegate setSync:NO];
error = YES;
}];
});
}
И в конце синхронизации готов:
[[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
backgroundTaskID = UIBackgroundTaskInvalid;
но этот код не работает, кто есть идея, как я могу преодолеть этот вызов?
Способ синхронизации - запрашивать данные до тех пор, пока их больше не будет. но с этим кодом он просто заканчивается в объекте backgroud, который принимает в то время, которое входит в фоновый режим
сейчас только скачайте текущий пакет. Мне нужно было загрузить примерно 8 и сохранить в основных данных, которые занимают 5-10 минут. какие-либо предложения? – Pedro
Вы имеете в виду, что вам нужно загрузить 8 ответов, а не только 1. Вы можете одновременно запускать 4 загрузки (используя разные потоки). Основная проблема заключается в том, что вы не можете быть настолько уверены в том, сколько времени вам будет предоставлено (сеанс URL-адресов помогает в этом). – Wain
Я вижу, что вы используете RestKit, который еще не поддерживает сеансы url. Вы можете посмотреть настройку совпадения операций очереди операций диспетчера объектов и одновременное создание всех необходимых загрузок. – Wain