我有一个需要上传到服务器的文件列表。
我想仅在文件成功上传之前上传每个文件。
我正在寻找一种优雅的方式来实现它。
例如使用coroutines
之类的功能。
那么在swift中有一个像coroutines
这样的功能吗?
有没有其他优雅的方法来实现这个?
由于
答案 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
}
}
串行队列将一次运行一个作业,整个队列将在后台异步执行。