2015-10-22 5 views
0

Я использую метод выборки фона performFetchWithCompletionHandler, чтобы обновить некоторые пользовательские данные. Однако эти процессы довольно сложны и включают в себя операторы блоков, поэтому они не выполняются синхронно.Как правильно выполнить executeFetchWithCompletionHandler с несколькими блоками внутри

Меня беспокоит то, что я всегда возвращался completionHandler(UIBackgroundFetchResultNewData);

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    NSLog(@"Start background data fetch"); 

    // Update data -- this method contains various blocks inside 
    [GETDataRequest updateUserDataWithUser: user]; 

    // Update images -- this method contains various blocks inside 
    [GETImagesRequest updateUserImagesWithUser: user]; 

    NSLog(@"Background Data Fetch completed"); 
    completionHandler(UIBackgroundFetchResultNewData); 
} 

Согласно this post, в отношении к completionHandler(UIBackgroundFetchResultNewData) следующее было сказано:

Вы должны назвать это позволить IOS знать, что в результатом вашей фоновой выборки был. Он использует эту информацию для планирования будущих фоновых настроек. Если вы пренебрегаете этим, будущие фоновые выборки могут быть отложены ОС. Последствия отказа от вызова этого обработчика могут включать полное прекращение действия приложения.

Как вы можете видеть здесь, я всегда говорю, что это успешно, действительно ли это на самом деле. Ответчик должен был сказать о моей ситуации:

... вы должны вызвать обработчик завершения только тогда, когда ваш выбор действительно завершен. В противном случае iOS, вероятно, вернет ваше приложение обратно до того, как соединение завершится, и приложения на самом деле не смогут определить UIBackgroundFetchResultNewData по сравнению с UIBackgroundFetchResultNoData или UIBackgroundFetchResultFailed до тех пор в любом случае. Как вы узнаете, что ваше соединение будет успешным?

Является ли то, что я делаю НАСТОЯЩАЯ проблема? Будет ли он фактически отключать обновления? Если это принесет неожиданные результаты, каково решение этого беспорядка? Ответ на упомянутый мною вопрос был для меня неясным. Я попытался использовать блок-переменные, чтобы он функционировал так, как должен, но не увенчался успехом. Очень признателен.

+0

«Вы должны вызвать обработчик завершения только тогда, когда ваш выбор действительно завершен». Это совершенно неправильно. Как раз наоборот. Если вы не перезвоните и не вернетесь назад, вы никогда не получите возможность выбора фона; система будет «черным» вам. – matt

ответ

0

Однако эти процессы довольно сложны и включают в себя заявление блока, так что они не выполняют синхронно

Если это «сложное», разбить его на простые биты. И не лгите системе. И всегда вызов обработчика завершения в конце. Вы можете передать обработчик завершения в свой сетевой код, чтобы код вашей сети мог называть его в конце - вам не нужно возвращаться здесь, чтобы позвонить ему, но вы должны должны назвать это, и это должно быть последний предмет сделав.

Похоже, вы не понимаете политики, которой руководствуется система. Фоновая выборка означает, что вы просите систему просыпаться или запускать приложение в фоновом режиме время от времени, чтобы он мог выполнять загрузку в фоновом режиме. Когда вы вызываетесь назад, часы начинают отсчитывать; вы должны быть быстро или система будет неохотно давать вам больше времени, так что сделайте небольшой быстрый кусок загрузки и выйдите, называя обработчик завершения и , останавливая.

+1

Итак, вы говорите, что для людей, которые используют кучу уже построенной инфраструктуры, опираясь на несколько уровней блоков поверх AFNetworking, необходимо полностью переписать весь их сетевой код, чтобы быть синхронным, чтобы его можно было использовать правильно внутри 'performFetchWithCompletionHandler'? – Marcel

0

Код, который вы используете, предназначен для использования функции Fetch Refresh Refresh, благодаря этому вы можете быстро обновить свое приложение, когда оно находится в фоновом режиме, указав системный интервал времени на минимум. Эта услуга доступна в методе делегата executeFetchWithCompletionHandler, и она будет длиться 30 секунд. Вам необходимо управлять своим кодом, чтобы получить обновленный результат, а затем в конце в соответствии с вашим результатом вам нужно вызвать соответствующий блок обработчика завершения. Если у вас есть работа в фоновом режиме, я предпочел бы использовать службы фоновой выборки, используя NSURLSessions.

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