使异步方法同步

时间:2015-05-27 15:48:28

标签: ios swift

在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!)
                }
            }
        }


    }

1 个答案:

答案 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%被浪费,那只会很糟糕。