Выполнять запрос AFHTTPClient в фоновом режиме с помощью NSOperationQueue в хронологическом порядке
У меня есть запрос HTTPClient следующим образом:
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:urlStringMain]];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
//parameters
nil];
[self beginBackgroundUpdateTask];
[httpClient postPath:postPath parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
//id results = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONWritingPrettyPrinted error:nil];
//completion code
[self endBackgroundUpdateTask];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//failure code
}];
[httpClient release];
Фоновое задание выполняется в:
- (void) beginBackgroundUpdateTask{
[operationQueue addOperationWithBlock:^{
NSLog(@"started upload process as a background job");
self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundUpdateTask];
}];
}];
}
И закончилось:
- (void) endBackgroundUpdateTask{
NSLog(@"complete upload process as a background job");
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}
где self.backgroundUpdateTask является UIBackgroundTaskIdentifier
объект, а операция Queue является объектом NSOperationQueue
(публичный член), инициализированный в viewDidLoad
:
operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];
Теперь я хочу выполнить эти запросы в хронологическом порядке, в фоновом режиме, так что нажатие / извлечение из viewController
не влияет на запрос. Это также не должно быть затронуто, если приложение переходит в фоновый режим. Иногда я публикую текст, а иногда - изображение. Теперь для загрузки изображений требуется больше времени, чем для текста, поэтому при последующих запросах текста и изображений сначала публикуются тексты, а потом изображения. Это нарушает хронологию задач, поэтому я хотел использовать NSOperationQueue
, Но, будучи новичком в очередях работы, я не могу заставить его работать. Хронология до сих пор не соблюдается. Как мне выполнить задачу так, как я хочу.
PS. Кроме того, как вы можете видеть в коде, я добавил [self endBackgroundUpdateTask]
в обоих, блок завершения httpClient
запрос и метод beginBackgroundUpdateTask. Теперь я понимаю, что это не хорошо. Где именно должен вызываться метод endBackgroundUpdateTask?
Спасибо.
1 ответ
HTTPClient
может выполнить фоновую задачу, если вы ее попросите, просто установите соответствующий флаг (вам нужно создать операцию и вызвать setShouldExecuteAsBackgroundTaskWithExpirationHandler:
).
Вместо того, чтобы изменить способ загрузки, сделайте это просто. Отправьте дату с загрузкой и используйте ее для хранения информации о вашем заказе на сервере.
Если вы действительно должны выполнять свои операции последовательно, то вы можете получить operationQueue
от клиента и установите его для выполнения только одной операции за раз.
В любом случае вам не нужно создавать собственную очередь операций.