iOS - 并发执行5次操作,使用NSOperationQueue将图像上传到服务器,然后在Objective-c中使用单个任务

时间:2017-05-26 05:26:10

标签: ios objective-c objective-c-blocks nsoperationqueue reachability

我必须同时使用nsoperationqueue执行以下操作。

我需要像5一样在后台执行多个操作(上传     文件到服务器),我必须管理所有队列依赖于遵循scenorio

  • 1)网络是2G只执行1次操作,剩下4次操作 应该停止

  • 2)网络是3G / Wifi并行执行所有操作。

如何使用Objective-c ???

实现此目的

提前致谢。

1 个答案:

答案 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
    })
 }

您也可以取消并完成操作。