- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
制作 NSURLSessionTasks
串行队列的最佳实践是什么?
就我而言,我需要:
NSURLSessionDataTask
)NSURLSessionDownloadTask
)这是我目前所拥有的:
session = [NSURLSession sharedSession];
//Download the JSON:
NSURLRequest *dataRequest = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *task =
[session dataTaskWithRequest:dataRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//Figure out the URL of the file I want to download:
NSJSONSerialization *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSURL *downloadURL = [NSURL urlWithString:[json objectForKey:@"download_url"]];
NSURLSessionDownloadTask *fileDownloadTask =
[session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:playlistURL]]
completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
NSLog(@"completed!");
}];
[fileDownloadTask resume];
}
];
除了在另一个完成中编写完成 block 看起来很乱之外,我在调用 [fileDownloadTask resume]
时收到 EXC_BAD_ACCESS 错误...即使 fileDownloadTask
不是零!
那么,NSURLSessionTasks
的最佳排序方式是什么?
最佳答案
您需要使用最直接的方法:https://stackoverflow.com/a/31386206/2308258
或者使用操作队列并使任务相互依赖
============================================= ========================
关于 HTTPMaximumConnectionsPerHost 方法
An easy way to implement a first-in first-out serial queue of NSURLSessionTasks is to run all tasks on a NSURLSession that has its HTTPMaximumConnectionsPerHost property set to 1
HTTPMaximumConnectionsPerHost 仅确保一个共享连接将用于该 session 的任务,但这并不意味着它们将被串行处理。
您可以使用 http://www.charlesproxy.com/ 在网络级别验证这一点,你会发现当设置 HTTPMaximumConnectionsPerHost 时,你的任务仍然会被 NSURLSession 同时启动,而不是像想象的那样串行。
实验 1:
使用任务 2:url = download.thinkbroadband.com/20MB.zip
结果:task1 completionBlock被调用然后task2 completionBlock被调用
完成 block 可能会按照您预期的顺序调用,以防任务花费相同的时间但是如果您尝试使用相同的 NSURLSession 下载两个不同的东西,您会发现 NSURLSession 确实没有任何潜在的调用顺序,但只完成最先完成的。
实验 2:
任务 2:url = download.thinkbroadband.com/10MB.zip(较小的文件)
结果:task2 completionBlock被调用然后task1 completionBlock被调用
总而言之,您需要自己进行排序,NSURLSession 没有任何关于排序请求的逻辑,即使将每个主机的最大连接数设置为 1,它也只会调用先完成的 completionBlock
PS:对于帖子的格式,我很抱歉我没有足够的声誉来发布屏幕截图。
关于ios - 制作 NSURLSessionTask 队列的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20618681/
我有一个可以从网站下载文件的 iOS 应用程序。我创建了一个 NSURLSession在一个类(class)Downloads来管理它们。 Downloads类有 NSMutableArray使用我的
您好,我正在尝试从 swift 客户端在 Java 服务器上执行简单的身份验证。 java 服务器是一个 HTTP 服务器,其代码接受带有用户名和密码的“POST”请求。如果用户名和密码正确,服务器返
我好像遇到了麻烦。出于某种原因,如果我尝试检查我的 NSURLSessionTask 对象的类类型,它根本不起作用。如果我检查它们的 taskDescription 属性,如果我在启动任务之前设置它们
我想知道是否可以重新运行失败的 NSURLSessionDataTask。这是我遇到此问题的背景。 我有一个 Web 服务对象,它使用 AFNetworking 2.0 来处理请求。在我的一种方法中,
这是 Apple 文档中关于 NSURLSessionTask 类的 suspend 方法的内容 A task, while suspended, produces no network traffi
我正在使用带有后台 session 的 NSURLSessionDownloadTask 来实现我所有的 REST 请求。这样我就可以使用相同的代码,而不必考虑我的应用程序是在后台还是在前台。 我的后
我想创建文件下载管理器来下载多个具有下载百分比和播放暂停删除功能的文件。 我尝试使用以下代码成功下载多个文件...但无法添加进度条请帮忙 for (int i = 0; i 然后您需要遵循以下代码:
假设我有一个正在运行的NSURLSessionUploadTask。如果应用程序在该时间范围内被终止或崩溃,待处理的请求会发生什么?任务仍然会完成还是也会终止? 最佳答案 这是凭内存而来的,所以对它持
我几乎可以肯定,我最近看到了一种与网络相关的方法,该方法允许使用 NSDictionary 设置 URL 参数。 它是新 NSURLSession 类的一部分,但我找不到它。 本质上,而不是像...那
我使用 NSURLSessionTask 并且我正在尝试监控我的一些 HTTP 请求需要多长时间,当 NSURLSessionTask 实际上发出初始请求?如果这是 NSOperation 中的 NS
这个问题在这里已经有了答案: block until reverseGeocode has returned (1 个回答) 关闭 7 年前。 我有一个简单的 NSURLConnection 任务
我正在使用 AFNetwork 3.0 进行 HTTP 获取请求。我什至得到回应。但我想将响应数据作为 NSString。有人可以帮我如何获取响应数据作为 NSString 这是我的代码, AFHTT
我经常有这样的代码,当我有一个处理与 REST API 通信的类时,里面有很多方法使用 NSURLSession 任务,闭包作为回调。我还提供了其中一些方法的回调闭包,这样我就可以一个接一个地链接不同
制作 NSURLSessionTasks 串行队列的最佳实践是什么? 就我而言,我需要: 获取 JSON 文件中的 URL(NSURLSessionDataTask) 在该 URL 下载文件 (NSU
在我的 iOS 应用程序中,我使用 NSURLSessionTask 将 json 数据下载到我的应用程序。我发现当我直接从浏览器调用 url 时,我会得到一个最新的 json,而当它从应用程序中调用
我的 Swift 应用程序有一个奇怪的行为,我目前不明白。 我对 NSOperation 进行了子类化,以创建可以通过 NSURLSession/NSURLSessionTask 调用 Rest-We
我为我的应用程序编写了一个单独的 WebServices 类 - WebServices.m。 其中,我有几个静态方法,例如 setUserInput()、getUserProfile()、regis
当我关闭 WiFi 连接并在 iPhone 6s 10.2 模拟器上运行以下代码时,回调永远不会执行。我预计回调会很快触发,并出现“无互联网连接”之类的错误。 NSLog(@"request-star
我正在实现自定义 NSURLProtocol,并且在内部希望使用 NSURLSession 处理内部网络的数据任务,而不是 NSURLConnection。 我遇到了一个有趣的问题,想知道 NSURL
如果我创建一个 NSURLSessionDownloadTask,然后在它完成之前取消它,完成 block 似乎仍然会触发。 let downloadTask = session.downloadTa
我是一名优秀的程序员,十分优秀!