0

谁能告诉我在 iOS 中进行 http 网络调用时在 NSOperation 中使用 NSURLSessionTask 获得的真正优势是什么?我们可以通过将 NSURLSessionTask 包装在任何其他普通自定义类(例如 APIRequest)中来获得抽象。使用 NSOperation 进行网络调用背后的真正座右铭是什么?提前致谢。

4

1 回答 1

1

我的第一个倾向是说“什么都没有”,但再想一想,这可能有点过于油嘴滑舌了。

一般来说,如果您的应用程序已经使用 NSOperation来执行其他任务,那么让您的网络操作只是另一种特殊类型的操作可能会很有用,这样您就可以以同样的方式管理它们。当然,如果你这样做了,你几乎肯定不应该直接使用 NSOperation。相反,使用 NSOperation 的自定义子类,当您调用它的取消方法时,它实际上知道如何取消网络操作。如果误用,按原样使用 NSOperation 类可能比无用更糟糕。

我对它为什么如此普遍的最好解释是历史性的。显然,许多程序员错误地认为将同步 NSURLConnection 请求包装在 NSOperation 对象中可以让他们取消这些请求。实际上,它所做的只是阻止应用程序从请求中获取数据,但请求一直持续到完成。不幸的是,在更新代码以使用 NSURLSession 时,遗留的包袱经常被带走,现在可能和当时一样有问题。

正如其他人在评论中提到的那样,您也可以表面上使用操作来允许在您的应用程序进入后台后继续挂起的请求,但总的来说,这样做可能是一个错误。毕竟:

  • 对于短请求,与仅在前台重新发出请求相比,这几乎没有优势。
  • 对于长请求,后台下载/上传是更好的选择,因为它们占用的资源要少得多(因为您的应用程序可以被操作系统终止以释放内存)并且因为您有一个实际保证操作系统不会杀死反正你的过程。

所以说真的,使用自定义 NSOperation 子类的优势与在应用程序中使用 NSOperation 的优势相同——不多也不少。

于 2019-04-17T18:39:19.207 回答