在我的应用中创建/更新/删除记录时,它会在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到我的服务器?
由于
答案 0 :(得分:1)
这里最好的想法可能是使用AFHTTPRequestOperation
(或其中一个子类)并在它们之间创建依赖关系:2 op。取决于1 op。,3 op。取决于2 op。等等...
请查看AFNetworking
和NSOperation
文档(AFHTTPRequestOperation
是NSOperation
的子类)。
答案 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连接数量以及设备天线带宽的限制,两者都有上限。