Выполнение запроса 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, а operationQueue — это объект NSOperationQueue (общедоступный член), инициализированный в viewDidLoad:

operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount];

Теперь я хочу выполнить эти запросы в хронологическом порядке, в фоновом режиме, чтобы нажатие/выталкивание из viewController не влияло на запрос. Это также не должно быть затронуто, если приложение переходит в фоновый режим. Иногда я выкладываю текст, а иногда выкладываю изображение. Теперь изображения загружаются дольше, чем текст, поэтому при последующих запросах текста и изображений сначала публикуются тексты, а затем изображения. Это нарушает хронологию задач, поэтому я хотел использовать NSOperationQueue. Но, будучи новичком в очередях операций, я не могу заставить его работать. Хронология до сих пор не соблюдается. Как мне выполнить задачу так, как я хочу.

PS. Кроме того, как вы можете видеть в коде, я добавил [self endBackgroundUpdateTask] как в блок завершения запроса httpClient, так и в метод beginBackgroundUpdateTask. Теперь я понимаю, что это нехорошо. Где именно должен вызываться метод endBackgroundUpdateTask?

Спасибо.


person n00bProgrammer    schedule 05.10.2013    source источник


Ответы (1)


HTTPClient может выполнить фоновую задачу за вас, если вы попросите его об этом, просто установите соответствующий флаг (вам нужно создать операцию и вызвать setShouldExecuteAsBackgroundTaskWithExpirationHandler:).

Вместо того, чтобы менять способ загрузки, сделайте его простым. Отправьте дату загрузки и используйте ее для хранения информации о вашем заказе на сервере.


Если вы действительно должны выполнять свои операции последовательно, вы можете получить operationQueue от клиента и настроить его на выполнение только одной операции за раз.

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

person Wain    schedule 05.10.2013
comment
Это не поможет. Сервер использует собственные часы, чтобы присваивать метку времени всем сообщениям. - person n00bProgrammer; 05.10.2013