gpt4 book ai didi

ios - NSURLSession 和 NSDefaultRunLoopMode

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:32 27 4
gpt4 key购买 nike

使用 NSURLConnection 时,您可以选择使用 NSRunLoop 安排连接:

- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode

传递 NSDefaultRunLoopMode 会在用户滚动时有效地导致连接暂停,这对性能非常有利,因为用户体验永远不会受到下载的影响。

有没有办法让 NSURLSession 有类似的行为?我已通读文档并尝试了各种配置 session 的方法,但均未成功。

最佳答案

NSURLSession在“上层”级别工作,对开发人员来说比使用 NSURLConnection 更简单.
我做了一些测试,我认为不可能控制 runloop 和 NSURLSession 的模式。 ,因为它们似乎由外部守护程序管理,而不是由您的应用程序管理(我仅使用 NSURLSessionDownloadTask 进行了测试)。
做这个简单的测试:

  1. 下载并执行this Github project
  2. 开始下载
  3. 打开“下载” Controller 查看下载状态
  4. 暂停应用
  5. 等一下
  6. 取消暂停应用

您会看到在您的应用程序暂停时下载仍在继续,因此当您启动 NSURLSession 时控制被传递给应用程序外部的系统:这意味着工作的主要部分不会发生在内部 runLoop 中。

您唯一可以控制的是在其上调度委托(delegate)调用(传递回您的应用程序)的串行队列。委托(delegate)调用排队等待执行(在主线程或后台线程上,您可以选择它),因为 NSOperationQueue使用 Grand Central Dispatch 对调用进行排队,我不确定用于此的运行循环模式,但我认为这是继续您的研究的一个很好的起点。

编辑:如果我没记错的话,在后台线程上进行的调度调用是在运行循环未运行的线程上进行的。事实上,如果你添加这一行

NSLog(@"%@", [[NSRunLoop currentRunLoop] currentMode]);

关于 FLDownloader 的委托(delegate)方法之一上一个项目中的类,你会看到没有运行模式(nil),当runloop没有运行时会出现这种情况。

关于ios - NSURLSession 和 NSDefaultRunLoopMode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098106/

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