在后台执行AFHTTPClient请求,按时间顺序使用NSOperationQueue

时间:2013-10-05 08:51:47

标签: iphone ios nsoperationqueue afhttpclient

我有一个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方法?

谢谢。

1 个答案:

答案 0 :(得分:1)

HTTPClient可以为您处理后台任务,只需设置相应的标志(您需要创建操作并调用setShouldExecuteAsBackgroundTaskWithExpirationHandler:)。

不要改变上传的运作方式,请保持简单。发送上传日期并使用它来维护服务器上的订单信息。


如果您真的必须按顺序执行操作,那么您可以从客户端获取operationQueue并将其设置为一次只执行一次操作。

在任何一种情况下,您都不需要创建自己的操作队列。