在dispatch_async()里面我运行下一个代码来上传图片。脚本同时上传所有图像,导致CPU以100%运行。我想逐个上传图片,但无法弄清楚如何。我尝试使用以下代码:
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group)
dispatch_group_leave(group)
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
但这也冻结了主线程。
上传图片的代码:
for imageObj in receiptImageObjList {
api.uploadImage(imageObj){ status, message, json in
if(status == true){
var images = json!["data"]["images"].arrayValue
cdm.imageFromApi(imageObj, jsonData: images.last!)
if(imageObj.fileName != nil){
var fileManager = FileManager()
fileManager.deleteImage(imageObj.fileName!)
}
}
}
}
答案 0 :(得分:1)
您应该创建一个dispatch_semaphore_t,其计数为6,即6。在每次上传开始之前,您调用dispatch_semaphore_wait,并在上载完成后(不再使用CPU时间),调用dispatch_semaphore_signal。确保无论发生什么,调用dispatch_semaphore_wait后都会调用dispatch_semaphore_signal。
效果是您不会同时进行超过六次上传呼叫;第7个呼叫将等待而不花费任何CPU时间,直到某些呼叫结束并呼叫信号。除此之外,您的计划行为不会有任何变化。除了"对于"中的图像循环不会在一毫秒内完成,因为它将等待信号到信号量,所以你最好在后台线程上运行整个东西。六号显然可以替换为任何其他数字。
但只是说:如果CPU做有用的工作,使用100%CPU并不是坏事。如果100%的90%被浪费,那只会很糟糕。