将 NSURLSessionTask 包装在 iOS NSOperations 中的优势

Advantage of wrapping NSURLSessionTask inside iOS NSOperations

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

我的第一反应是"none whatsoever",但仔细想想,这可能有点过于油嘴滑舌了。

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

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

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

  • 对于短请求,与仅在前台重新发出请求相比,这几乎没有优势。
  • 对于长请求,后台 downloads/uploads 是更好的选择,因为它们占用的资源要少得多(因为您的应用程序可以通过 OS 终止以释放内存)并且因为您实际保证 OS 无论如何都不会终止您的进程。

所以说真的,使用自定义 NSOperation subclass 的优势与对应用程序中的任何其他内容使用 NSOperation 的优势相同——不多也不少。