最后一个请求完成后发送下一个请求
Posted
技术标签:
【中文标题】最后一个请求完成后发送下一个请求【英文标题】:Send next request when last one is done 【发布时间】:2016-04-18 09:35:15 【问题描述】:我有 100 多个请求。我需要在最后一个请求完成后发送一个新请求,因此服务器不会返回错误代码 - 429。 如何通过afnetworking 3.0做到这一点?
【问题讨论】:
尝试批量操作队列 【参考方案1】:我对@987654321@的具体API不是很熟悉,但是你可以设置:
-
一个包含所有待处理请求的变量数组,
称为(例如)
sendNext()
的方法删除数组的第一个条目,异步执行请求,并在完成块内调用自身。
当然,您需要一个终止条件,即当数组为空时停止。
【讨论】:
thx。这是解决我代码中问题的方法。我正在通过afnetworking寻找更好的方法。 如果它具有某种批处理/队列功能会很棒。不过我没用过这个框架。【参考方案2】:有两种方法可以解决您的问题。
首先,创建一个操作队列并将所有请求添加到队列中。之后,创建新请求的操作,然后将依赖项添加到队列中的所有请求。因此,您的新操作(将执行新请求)将在最后一个请求完成后执行。
其次,您可以使用 dispatch_barrier_async,它将在您的并发队列上创建一个同步点。这意味着您应该创建一个并发队列来执行 100 多个请求,并且您的自定义队列中的 dispatch_barrier_async 块将执行新请求。
【讨论】:
【参考方案3】:Thanks Sendoa for the link to the GitHub issue where Mattt explains why this functionality is not working anymore. There is a clear reason why this isn't possible with the new NSURLSession structure; Tasks just aren't operations, so the old way of using dependencies or batches of operations won't work.
I've created this solution using a dispatch_group that makes it possible to batch requests using NSURLSession, here is the (pseudo-)code:
// Create a dispatch group
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < 10; i++)
// Enter the group for each request we create
dispatch_group_enter(group);
// Fire the request
[self GET:@"endpoint.json"
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject)
// Leave the group as soon as the request succeeded
dispatch_group_leave(group);
failure:^(NSURLSessionDataTask *task, NSError *error)
// Leave the group as soon as the request failed
dispatch_group_leave(group);
];
// Here we wait for all the requests to finish
dispatch_group_notify(group, dispatch_get_main_queue(), ^
// Do whatever you need to do when all requests are finished
);
I want to look write something that makes this easier to do and discuss with Matt if this is something (when implemented nicely) that could be merged into AFNetworking. In my opinion it would be great to do something like this with the library itself. But I have to check when I have some spare time for that.
【讨论】:
【参考方案4】:这个问题可能与 AFNetworking 3.0 AFHTTPSessionManager using NSOperation 重复。您可以关注@Darji 评论以获取少量电话,对于 100+ 电话添加这些实用程序类 https://github.com/robertmryan/AFHTTPSessionOperation/ 。 同时发送 100+ 个请求操作是非常不切实际的方法。如果可能,尽量减少它。
【讨论】:
以上是关于最后一个请求完成后发送下一个请求的主要内容,如果未能解决你的问题,请参考以下文章