У меня есть запрос 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?
Спасибо.