0

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

谢谢你。

4

1 回答 1

1

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

与其改变上传的操作方式,不如保持简单。发送上传日期,并使用该日期在服务器上维护您的订单信息。


如果您确实必须连续执行操作,那么您可以operationQueue从客户端获取并将其设置为一次仅执行一个操作。

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

于 2013-10-05T09:12:45.607 回答