2017-07-19 28 views
0

こんにちは、私は最近iOSアプリケーションをSwift 3.1(Xcode 8.3.3)に移行しました。私は自分自身でほとんどの問題を理解しましたが、最後の1つのバグはまだ私を悩ましています。まあ、ショートストーリーをカットするために、私は、Webサービスへの呼び出しを行うためのAlamofireライブラリを使用して、次のようにいくつかの方法での発送Syncを使用:Swift 3.1 Migration Dispatch.main.asyncメンバー 'async(execute :)'へのあいまいな参照です。

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行でエラーが発生しました。あなたは人々が何が起こっているかを知ることができますか?

+0

あなたはこれを試していました{() - >ここであなたのコードを無効にしてください}) – u84six

+0

はいu84sixはすでにこれを行いましたが動作しませんでした。問題は解決されていますが、私はすぐに以下の回答を投稿しています。 – Ali

答えて

1

問題はDispatchQueue.main.asyncではなかったが、Alamofireのuploadprogressの構文で、次のブロックとそれを交換し、問題が解決されました:DispatchQueue.main.async(実行します:

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