我有一个高度异步的环境和许多模块,它们可以请求特定的网络资源(例如访问令牌,也可能间接地通过可传递的请求)。
例如,代码中的许多地方可以“同时”进行调用以发送分析:
// module 1
[Analytics sendAnalytics:module1Analytics];
// module 2
[Analytics sendAnalytics:module2Analytics];
...分析请求需要有效的访问令牌,并且发送代码可能包含对应更新的过期访问令牌的特殊关注
+(void)sendAnalaytics:(Analytics)analyticsPayload {
//... setup code ...
NSURLRequest *analyticsRequest = // Analytics NSURLRequest with a special access token
// the network request to send the analytics
[[MyNSURLSession dataTaskWithRequest:analyticsRequest completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error)){
if (error == 401) {
get new access token
// re-send the same request
[self sendAnalaytics:analyticsPayload];
}
// ....
}] resume];
}我不想同时请求相同的资源。如果相同的资源已经在运行,我想对它进行批处理调用。
// batch this call to only happen once if already running
NSURLRequest *accesstoken = ...
....此外,访问令牌永远不应该被缓存(使用"NSURLCache“et.al机制。)
我需要优化网络访问,这样我就不会处理多余的请求。
发布于 2016-09-25 03:50:15
不是的。您必须在NSURLSession周围添加自己的包装器代码才能做到这一点。
你可能应该有一个分析单例类来处理在需要的地方合并多个请求,重试等,这样所有的调用者必须做的就是[MyAnalyticsClass updateAnalyticsWithParameters: @{...}]或其他什么。
然后,在该调用中,您应该检查是否有正在进行的请求。如果没有,请立即启动请求。如果是,则将新请求排入队列。当当前请求完成时,查看队列并决定发送哪些请求,合并哪些请求,等等,然后开始下一个请求。
https://stackoverflow.com/questions/37319269
复制相似问题