我有一个 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 方法到底应该在哪里调用?
谢谢你。