Swift 3.1 Migration Dispatch.main.async对成员'async(execute :)'的模糊引用

时间:2017-07-19 12:10:08

标签: ios swift3 dispatch-async

大家好我最近将我的iOS应用程序迁移到Swift 3.1(Xcode 8.3.3)。我已经找到了自己的大部分问题,但最后一个错误仍然困扰着我。好吧,为了缩短故事,我使用Alamofire库来调用webservices并使用Dispatch Sync在几个方法中如下:

class func createVideoActivity(_ type: Int, permission: Int, message: String, video: URL, progressview:UIProgressView , completion: @escaping (_ type: ResponseType , _ response : Int, _ message: String) -> Void) {

        let user_id = CFunctions.getSession("id")

        var serviceURL = baseURL + "&task=createActivity&user_id=\(user_id)&type=\(type)&permission=\(permission)"

        serviceURL = serviceURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
        let url = URL(string: serviceURL)
        let authHeader = ["":""]

        let mimetype = "video/mov"

        var movieData: Data?
        do {
            movieData = try Data(contentsOf: URL(fileURLWithPath: (video.relativePath)), options: NSData.ReadingOptions.alwaysMapped)
        } catch _ {
            movieData = nil
            return
        }
        let filename = "upload.mov"

        upload(
            multipartFormData:{ multipartFormData in
                multipartFormData.append(movieData!, withName: "filedata",fileName: filename,mimeType: mimetype)
                multipartFormData.append(message.data(using: String.Encoding.utf8)!, withName: "message")
            },
            to: url!,
            headers: authHeader,
            encodingCompletion:
            {
                encodingResult in
                switch encodingResult {
                case .success(let uploads, _, _):

                    .uploadProgress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in

                        DispatchQueue.main.async {
                            let percent = (Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))
                            print(percent)
                            progressview.setProgress(percent, animated: true)
                        }

                    }
                    uploads.validate()
                    uploads.responseJSON { serverResponse in

                        switch serverResponse.result {

                        case .success(let JSON):

                            debugPrint(JSON)

                            if (JSON as AnyObject).value(forKey: "status") as! Int == 1 {
                                completion( ResponseType.kresponseTypeSuccess,(JSON as AnyObject).value(forKey: "status") as! Int, (JSON as AnyObject).value(forKey: "response") as? String ?? "")
                            } else {
                                completion( ResponseType.kresponseTypeSuccess,(JSON as AnyObject).value(forKey: "status") as! Int, (JSON as AnyObject).value(forKey: "response") as? String ?? "")


                            }

                        case .failure(let error):

                            let dataString = String(data: serverResponse.data!, encoding: String.Encoding.utf8)
                            print("createVideoActivity Request failed with error: \(String(describing: dataString))")
                            completion(ResponseType.kResponseTypeFail, error as! Int, "Service failed")

                        }

                    }
                case .failure(let encodingError):
                   print(encodingError)
                }
            }
        ) // upload - end
    }

我在Dispatch.main.sync行上收到“对成员'async(execute :)'”的错误引用。你能让人们知道发生了什么吗?

1 个答案:

答案 0 :(得分:1)

问题不在于DispatchQueue.main.async,而在于使用Alamofire的uploadProgress语法,将其替换为以下块并解决了问题:

uploads.uploadProgress { (progress: Progress)  in
       DispatchQueue.main.async {
               progressview.setProgress(progress.fractionCompleted, animated: true)
       }
}