iOS清空请求队列

时间:2013-11-01 15:17:23

标签: ios objective-c networking http-post afhttpclient

在我的应用中创建/更新/删除记录时,它会在Core Data中创建OutgoingRequest。应用程序会定期将这些请求放入队列中,并将它们全部推送到服务器。我使用AFHTTPClient帖子(见下文)这样做。我遇到的问题是它一次推送所有这些请求,然后响应没有真正的顺序。

我需要做的是让这些请求同步工作,因为请求B在请求A完成(成功或失败响应)之前不应发布。这也是在后台完成的,不应该挂起UI。

for(OutgoingRequest *req in queue)
{
    NSURL *reqUrl = [NSURL URLWithString: globals.baseURL];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:reqUrl];
    [httpClient setParameterEncoding:AFJSONParameterEncoding];

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                            req.url, @"viewName",
                            req.json, @"JSON",
                            req.dateAdded.description, @"dateTime",
                            nil];

    NSString *path = [NSString stringWithFormat:@"cache/update/?deviceUID=%@&token=%@", [MySingleton getMacAddress],  globals.token];

    [httpClient postPath:path parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

            //handle the repsonse

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    }];
}

有没有办法用我目前的设置来实现这一目标?或者我应该使用其他方式POST到我的服务器?

由于

2 个答案:

答案 0 :(得分:1)

这里最好的想法可能是使用AFHTTPRequestOperation(或其中一个子类)并在它们之间创建依赖关系:2 op。取决于1 op。,3 op。取决于2 op。等等...

请查看AFNetworkingNSOperation文档(AFHTTPRequestOperationNSOperation的子类)。

答案 1 :(得分:1)

我建议您查看NSOperationQueue管理的内部AFHTTPClient。您可以将maxConcurrentOperationCount设置为1以使其成为一个串行队列,因此您的请求将按照您将它们添加到队列的顺序一次执行一个。

这是AFHTTPClient上的只读operationQueue属性。

/**
The operation queue which manages operations enqueued by the HTTP client.
*/
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;

无论您在何处进行客户端设置,请将并发操作计数设置为1。

myHTTPClient.operationQueue.maxConcurrentOperationCount = 1;

关于网络请求,无论如何,串行队列可能是个好主意。在一天结束时,并发请求的数量仍然受到服务器打开的HTTP连接数量以及设备天线带宽的限制,两者都有上限。