iOS - 批量(合并)网络请求到特定资源。 NSURLSession,NSURLRequest等之间的合作
问题描述:
我有一个高度异步的环境和许多模块可能会请求特定的网络资源(如访问令牌,也可能通过传递请求间接)。iOS - 批量(合并)网络请求到特定资源。 NSURLSession,NSURLRequest等之间的合作
比如很多地方的代码可以“同时”做话费送分析:
// module 1
[Analytics sendAnalytics:module1Analytics];
// module 2
[Analytics sendAnalytics:module2Analytics];
...
Analytics(分析)请求需要一个有效的访问令牌和发送代码可能包含特殊照顾过期的访问令牌,应该是重新
+(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的机制。)
有诸如应分批在一起的“接入令牌”请求其他请求(实例对图像的请求)。我需要优化网络访问权限,以便我不做冗余请求。
NSURL
加载系统是否提供内置机制,而无需自行收集请求?
答
不需要。您必须在NSURLSession中添加自己的包装代码才能做到这一点。
您应该可能有一个分析单例类,它可以处理在需要的地方合并多个请求,重试等,以便所有调用者必须做的是[MyAnalyticsClass updateAnalyticsWithParameters: @{...}]
或其他。
然后,在该调用中,您应该检查是否有请求正在进行。如果不是,立即开始请求。如果是这样,排队新的请求。当前请求完成时,查看队列并决定发送哪些请求,合并哪些请求等,然后开始下一个请求。