使异步方法同步



在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%被浪费了才是糟糕的。

最新更新