gpt4 book ai didi

ios - 制作 NSURLSessionTask 队列的最佳实践

转载 作者:IT王子 更新时间:2023-10-29 08:01:10 26 4
gpt4 key购买 nike

制作 NSURLSessionTasks 串行队列的最佳实践是什么?

就我而言,我需要:

  1. 获取 JSON 文件中的 URL(NSURLSessionDataTask)
  2. 在该 URL 下载文件 (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:

  • 声明一个 NSURLSession,HTTPMaximumConnectionsPerHost 为 1
  • 对于任务 1:url = download.thinkbroadband.com/20MB.zip
  • 使用任务 2:url = download.thinkbroadband.com/20MB.zip

    1. 调用 [task1 resume];
    2. 调用[task2 resume];

结果:task1 completionBlock被调用然后task2 completionBlock被调用

完成 block 可能会按照您预期的顺序调用,以防任务花费相同的时间但是如果您尝试使用相同的 NSURLSession 下载两个不同的东西,您会发现 NSURLSession 确实没有任何潜在的调用顺序,但只完成最先完成的。

实验 2:

  • 声明一个 NSURLSession,HTTPMaximumConnectionsPerHost 为 1
  • 任务 1:url = download.thinkbroadband.com/20MB.zip
  • 任务 2:url = download.thinkbroadband.com/10MB.zip(较小的文件)

    1. 调用 [task1 resume];
    2. 调用[task2 resume];

结果:task2 completionBlock被调用然后task1 completionBlock被调用

总而言之,您需要自己进行排序,NSURLSession 没有任何关于排序请求的逻辑,即使将每个主机的最大连接数设置为 1,它也只会调用先完成的 completionBlock

PS:对于帖子的格式,我很抱歉我没有足够的声誉来发布屏幕截图。

关于ios - 制作 NSURLSessionTask 队列的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20618681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com