以同步顺序运行异步任务

时间:2018-01-11 15:13:51

标签: ios swift

我有一个需要上传到服务器的文件列表。

我想仅在文件成功上传之前上传每个文件。

我正在寻找一种优雅的方式来实现它。

例如使用coroutines之类的功能。

那么在swift中有一个像coroutines这样的功能吗?

有没有其他优雅的方法来实现这个?

由于

3 个答案:

答案 0 :(得分:1)

您可以使用OperationQueue。创建一个这样的:

lazy var queue: OperationQueue = {
    let queue = OperationQueue()
    queue.maxConcurrentOperationCount = 1

    return queue
}()

然后像这样添加一个操作:

self.queue.addOperation {
    // The code you want run in the background
}

将maxConcurrentOperationCount设置为1后,它将作为不运行下一个任务的串行队列运行,直到当前任务完成为止。

这是最基本的功能,但您可以执行各种更高级的功能,请查看文档OperationQueue

答案 1 :(得分:0)

为什么不创建一个文件列表,并在一个上传的完成处理程序上只检查列表是否为空并启动下一个?我认为通过维护上传列表/队列可以更简单,而不是复杂的协同程序设置。

答案 2 :(得分:0)

您可以使用Grand Central Dispatch为其创建一个串行队列。与此处给出的答案中建议的OperationQueue相比,它具有节省大量开销的优点。有关详细信息,请参阅this post

这将创建串行队列:

let serialQueue = DispatchQueue(label: "someQueueIdentifier", qos: .background)

根据您的需要选择服务质量参数。

然后,你可以有一个循环,例如,你将后台作业放入这个队列:

while <condition> {
    serialQueue.async {
        // do background job
    }
}

串行队列将一次运行一个作业,整个队列将在后台异步执行。