Выполнять запрос 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 от клиента и установите его для выполнения только одной операции за раз.

В любом случае вам не нужно создавать собственную очередь операций.

Другие вопросы по тегам