2014-01-16 3 views
1

Мне нужно выполнить синхронизацию с сервером, когда мое приложение запущено. Иногда эта синхронизация может занять несколько минут. На 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, который принимает в то время, которое входит в фоновый режим

ответ

3

Ваш код вызывает [self synchronization]; внутри обработчика истечения срока действия. Этот блок вызывается только тогда, когда у вашего приложения заканчивается время для работы в фоновом режиме. Таким образом, вы пытаетесь начать синхронизацию только тогда, когда нет времени для этого.

Звонок [self synchronization]; наружный блок. Блок должен содержать код очистки/паузы и завершать фоновую задачу ...

Также обратите внимание на использование NSURLSession для хорошей совместимости с iOS 7.

+0

сейчас только скачайте текущий пакет. Мне нужно было загрузить примерно 8 и сохранить в основных данных, которые занимают 5-10 минут. какие-либо предложения? – Pedro

+0

Вы имеете в виду, что вам нужно загрузить 8 ответов, а не только 1. Вы можете одновременно запускать 4 загрузки (используя разные потоки). Основная проблема заключается в том, что вы не можете быть настолько уверены в том, сколько времени вам будет предоставлено (сеанс URL-адресов помогает в этом). – Wain

+0

Я вижу, что вы используете RestKit, который еще не поддерживает сеансы url. Вы можете посмотреть настройку совпадения операций очереди операций диспетчера объектов и одновременное создание всех необходимых загрузок. – Wain

Смежные вопросы