将 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
正是为此目的。
我这里有奇怪的情况。假设您有 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
正是为此目的。