我有一个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]
请求的完成块和beginBackgroundUpdateTask方法中都添加了httpClient
。现在我明白这不好。应该在何处调用endBackgroundUpdateTask方法?
谢谢。
答案 0 :(得分:1)
HTTPClient
可以为您处理后台任务,只需设置相应的标志(您需要创建操作并调用setShouldExecuteAsBackgroundTaskWithExpirationHandler:
)。
不要改变上传的运作方式,请保持简单。发送上传日期并使用它来维护服务器上的订单信息。
如果您真的必须按顺序执行操作,那么您可以从客户端获取operationQueue
并将其设置为一次只执行一次操作。
在任何一种情况下,您都不需要创建自己的操作队列。