将 NSOperationQueue 与 NSURLSession 一起使用以在调用之间引入依赖性是一种不好的方法吗?

Is using NSOperationQueue with NSURLSession to introduce dependency among the calls a bad approach?

我这里有奇怪的情况。假设您有 task1 (NSURLSessionUploadTask) 并且它正在上传一些巨大的数据并且用户启动 task2 (NSURLSessionDataTask) 如果 task1 失败则不应执行。另一方面,他可能会开始另一个任务 3,该任务应该 运行 独立。

所以我明显的选择是 NSOperationQueue 和依赖注入 tasks.Here 是我的代码。

import Foundation

class DependencyInjectorNSOperation : NSBlockOperation {
    var isSuccess : Bool = true
    var cleanUpCode : ((DependencyInjectorNSOperation) -> Void)? = nil

    override func cancel() {
        for operation in self.dependencies {
            operation.cancel()
        }
        isSuccess = false
        super.cancel()
    }

    override func start() {
        if cancelled == true {
            return
        }
        else if self.dependencies.count > 0 {
            for tasks in self.dependencies {
                if (tasks as! DependencyInjectorNSOperation).isSuccess != true{
                    cleanUpCode!(self)
                    return
                }
            }
             super.start()
        }
        else{
            super.start()
        }
    }
}

现在在 NSOperation 中,依赖将只负责序列化操作,但如果失败则不会取消所有依赖操作。所以我添加了一个名为 isSuccess 的 属性,我在启动函数中检查了它。因此,当任务失败时,我将此 属性 设置为 false,当其依赖任务启动时,我检查所有依赖任务是否成功完成,如果是,则我继续执行,否则关闭 NSOperation。

每个 NSOperations 都会启动一个 NSURLSessionTasks 并 运行 异步执行它。因此,如果 Web 请求成功,我会将 isSuccess 设置为 true,否则我会将其设置为 false。为了做到这一点,我停止了 NSOperation,直到 NSURLSessionTasks 结果成功或失败。

问题

根据我使用的模型,如果我必须进行 30 次 Web 调用,我将在 NSOperationQueue 中持有 30 个 NSOperations,并且每个都将阻塞一个线程,而其所有相关操作在 NSOperation Queue 中等待。

我的老板认为为每个任务引入 NSOperation 并在它们之间添加依赖关系并使 NSOperation 等待 Web 服务 returns 响应或错误是一种非常糟糕的方法。

如果您也有同样的想法,那么请建议我如何使用 Alamofire 或 NSURLSession 在几个 Web 服务调用之间实现序列化。

我想到 swift 使用 PromiseKit。任何人都可以建议如果 NSURLSessionTasks 异步启动并且它必须等待已经在执行的其他任务,它会工作吗?

提前致谢。

By the model I have used, if I have to make 30 web calls I'll be holding 30 NSOperations in NSOperationQueue and each will be blocking a thread while all its dependent operations wait in NSOperation Queue.

这不是真的。 Operation 在启动之前不会分配给线程,并且只要它的依赖项不完整,它就不会启动。管理任务依赖性正是 OperationQueue 的用途。

我可能不会完全按照您的方式进行编码(主要是关于使用 ! 的小事情,我可能会使用 !cancelled 而不是 isSuccess),但是您的基本方法几乎​​正是 Apple 在 Advanced NSOperations. If you're going to go this way, I suggest studying Apple's Earthquakes 代码中提出的方法,其中甚至包括一个 URLSessionTaskOperation 正是为此目的。