将NSURLSessionTask包装在iOS NSOperations中的优势

时间:2019-04-04 09:30:21

标签: ios nsurlsession nsoperationqueue nsoperation nsurlsessiontask

有人可以告诉我,在iOS中进行HTTP网络调用时,在NSOperation中使用NSURLSessionTask可获得的真正好处是什么?我们可以通过将NSURLSessionTask包装在任何其他普通自定义类(例如APIRequest)中来获得抽象。使用NSOperation进行网络通话的真正座右铭是什么?预先感谢。

1 个答案:

答案 0 :(得分:1)

我的第一个倾向是说“什么都没有”,但是再多考虑一下,那可能有点太过随意了。

通常,如果您的应用已经使用NSOperation 来执行其他任务,则将网络操作作为另一种特殊的操作类型可能会很有用,这样您就可以在其中进行管理一样的方法。当然,如果这样做,几乎可以肯定不应该直接使用NSOperation。而是使用NSOperation的自定义子类,该子类实际上在调用它的cancel方法时知道如何取消网络操作。如果滥用的话,按原样使用NSOperation类可能比没有用的情况更糟。

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

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

  • 对于短请求,与仅在前台重新发出请求相比,这几乎没有优势。
  • 对于长时间的请求,后台下载/上传是一个更好的选择,这是因为它们的资源消耗少得多(因为您的应用程序可以被操作系统终止以释放内存),并且可以保证操作系统获得了胜利。无论如何都不会杀死您的进程。

实际上,使用自定义NSOperation子类的优势与对应用程序中的其他任何事物使用NSOperation的优势相同-不多也不少。