2011-06-01 2 views
1

Я работаю над проектом, который взаимодействует с API данных Google. У меня есть несколько независимых классов для HTTP GET и HTTP POST для взаимодействия с Google, и они все асинхронны. Я обеспокоен тем, что пользователь может коснуться кнопки «Домой» до завершения операций, что приведет к разрыву в паритете синхронизации между сервером и клиентом. Я не понимаю API фоновой задачи, поскольку мне кажется, что я должен инкапсулировать каждый запрос GET или POST в фоновый блок, и каждый блок должен быть вызван из моего приложения-делегата. Это правда? Если это так, это вызовет серьезную головную боль, чтобы попытаться переписать много моей существующей логики загрузки и загрузки.Шаблон завершения задачи iOS для асинхронных загрузок и загрузок

Спасибо за ваш ввод! =)

ответ

2

Я рекомендую заказывать все HTTP-запросы с помощью NSOperationQueue, а затем использовать только одну фоновое задание. Вы можете указать, сколько операций разрешено запускать параллельно с setMaxConcurrentOperationCount.

При использовании рамки ASIHTTPRequest это очень легко с ASINetworkQueue, подкласс NSOperationQueue. Непрерывные загрузки в фоновом режиме также легко: http://allseeing-i.com/ASIHTTPRequest/How-to-use#background_downloads_ios.

+0

Благодарим за ответ. Я подтвердил ваш ответ, но я не могу использовать ASIHTTPRequest, потому что я использую другую оболочку, называемую GTMHTTPFetcher, которая волшебным образом обрабатывает всю аутентификацию Google OAuth. – Justin

2

Существует сторонняя библиотека под названием ASIHTTPRequest, которая делает этот процесс очень простым. Предполагая, что вы используете iOS 4, вы можете просто создать ASIHTTPRequest и установить параметр shouldContinueWhenAppEntersBackground в YES, и он будет инкапсулировать всю фоновую логику для вас и только разоблачить обратный вызов блока.

NSURL *url = [NSURL URLWithString:@"http://example.com/path/to/resource"]; 
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
request.shouldContinueWhenAppEntersBackground = YES; 
[request setCompletionBlock:^ 
{ 
    NSString *responseString = [request responseString]; 
}]; 
[request setFailedBlock:^{ 
    NSError *error = [request error]; 
    NSLog(@"Error = %@",error); 
}]; 
[request startAsynchronous]; 
+0

Я это видел, но поскольку это служба Google, я использую оболочку GTMHTTPFetcher и не уверен, что ASIHTTPRequest может ее обернуть. – Justin

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