首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS -对特定资源的批量(合并)网络请求。NSURLSession、NSURLRequest等之间的协作

iOS -对特定资源的批量(合并)网络请求。NSURLSession、NSURLRequest等之间的协作
EN

Stack Overflow用户
提问于 2016-05-19 17:34:26
回答 1查看 194关注 0票数 0

我有一个高度异步的环境和许多模块,它们可以请求特定的网络资源(例如访问令牌,也可能间接地通过可传递的请求)。

例如,代码中的许多地方可以“同时”进行调用以发送分析:

代码语言:javascript
复制
// module 1
[Analytics sendAnalytics:module1Analytics];


// module 2
[Analytics sendAnalytics:module2Analytics];

...

分析请求需要有效的访问令牌,并且发送代码可能包含对应更新的过期访问令牌的特殊关注

代码语言:javascript
复制
+(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];
}

我不想同时请求相同的资源。如果相同的资源已经在运行,我想对它进行批处理调用。

代码语言:javascript
复制
// batch this call to only happen once if already running
   NSURLRequest *accesstoken = ...
   ....

此外,访问令牌永远不应该被缓存(使用"NSURLCache“et.al机制。)

我需要优化网络访问,这样我就不会处理多余的请求。

EN

回答 1

Stack Overflow用户

发布于 2016-09-25 03:50:15

不是的。您必须在NSURLSession周围添加自己的包装器代码才能做到这一点。

你可能应该有一个分析单例类来处理在需要的地方合并多个请求,重试等,这样所有的调用者必须做的就是[MyAnalyticsClass updateAnalyticsWithParameters: @{...}]或其他什么。

然后,在该调用中,您应该检查是否有正在进行的请求。如果没有,请立即启动请求。如果是,则将新请求排入队列。当当前请求完成时,查看队列并决定发送哪些请求,合并哪些请求,等等,然后开始下一个请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37319269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档