我必须同时使用nsoperationqueue执行以下操作。
我需要像5一样在后台执行多个操作(上传 文件到服务器),我必须管理所有队列依赖于遵循scenorio
1)网络是2G只执行1次操作,剩下4次操作 应该停止
2)网络是3G / Wifi并行执行所有操作。
如何使用Objective-c ???
实现此目的提前致谢。
答案 0 :(得分:0)
检查您的互联网状态并按要求处理操作
串行调度队列
在串行队列中,每个任务在执行之前等待上一个任务完成。
当网络速度很慢时,您可以使用它。
let serialQueue = dispatch_queue_create("com.imagesQueue", DISPATCH_QUEUE_SERIAL)
dispatch_async(serialQueue) { () -> Void in
let img1 = Downloader .downloadImageWithURL(imageURLs[0])
dispatch_async(dispatch_get_main_queue(), {
self.imageView1.image = img1
})
}
dispatch_async(serialQueue) { () -> Void in
let img2 = Downloader.downloadImageWithURL(imageURLs[1])
dispatch_async(dispatch_get_main_queue(), {
self.imageView2.image = img2
})
}
并发队列
每个下载程序都被视为一项任务,所有任务都在同一时间执行。
网络快速使用时。
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue) { () -> Void in
let img1 = Downloader.downloadImageWithURL(imageURLs[0])
dispatch_async(dispatch_get_main_queue(), {
self.imageView1.image = img1
})
}
dispatch_async(queue) { () -> Void in
let img2 = Downloader.downloadImageWithURL(imageURLs[1])
dispatch_async(dispatch_get_main_queue(), {
self.imageView2.image = img2
})
}
<强> NSOpration 强>
当你需要开始一个取决于另一个的执行的操作时,你会想要使用NSOperation。
您还可以设置操作优先级。
对于不同的addDependency
, operation
queue = OperationQueue()
let operation1 = BlockOperation(block: {
let img1 = Downloader.downloadImageWithURL(url: imageURLs[0])
OperationQueue.main.addOperation({
self.imgView1.image = img1
})
})
// completionBlock for operation
operation1.completionBlock = {
print("Operation 1 completed")
}
// Add Operation into queue
queue.addOperation(operation1)
let operation2 = BlockOperation(block: {
let img2 = Downloader.downloadImageWithURL(url: imageURLs[1])
OperationQueue.main.addOperation({
self.imgView2.image = img2
})
})
// Operation 2 are depend on operation 1. when operation 1 completed after operation 2 is execute.
operation2.addDependency(operation1)
queue.addOperation(operation2)
您还可以设置优先级
public enum NSOperationQueuePriority : Int {
case VeryLow
case Low
case Normal
case High
case VeryHigh
}
您还可以设置并发操作
queue = OperationQueue()
queue.addOperation { () -> Void in
let img1 = Downloader.downloadImageWithURL(url: imageURLs[0])
OperationQueue.main.addOperation({
self.imgView1.image = img1
})
}
您也可以取消并完成操作。