在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!)
}
}
}
}
您应该创建一个dispatch_semaphore_t,其计数设为6。在每次上传开始之前,调用dispatch_semaphore_wait,当上传完成(不再使用CPU时间)时调用dispatch_semaphore_signal。确保无论发生什么,dispatch_semaphore_wait被调用之后,dispatch_semaphore_signal都会被调用。
效果是,您将不会同时进行超过六个上传呼叫;第7个调用将等待而不花费任何CPU时间,直到一些调用完成并调用信号。除此之外,程序的行为不会有任何变化。除了"for image in"循环不会在一毫秒内完成,因为它将等待信号量的信号,所以您最好在后台线程上运行整个过程。数字6显然可以用任何其他数字代替。
但只是说:如果CPU做有用的工作,使用100%的CPU并不坏。只有当这100%中的90%被浪费了才是糟糕的。