2016-02-02 5 views
9

私はマルチパートフォームデータで画像をアップロードするためにAlamofireを使用しました。私は目標達成に成功しています。私がイメージをアップロードするたびに、私は "uploadDocWebService"関数を呼び出します。したがって、関数が呼び出される回数は、画像の数に等しい。私は、それぞれの呼び出しの結果を特定することに絶望的です。私のイメージは正常にアップロードされます。サーバーに障害が発生した場合、またはインターネット接続に失敗した場合は、アップロードが失敗します。ビューから削除する必要があるイメージを特定できません。各画像アップロードのパラメータとしてindexPathを渡します。しかし、indexPathは最初の画像アップロードの結果を受け取る前に最新の画像アップロードに更新します。いずれにしても、私はこの状況に対してより良いアプローチを提案することができます。ここでAlamofireリクエストを複数回呼び出し、各コールの参照を取得します

は、私は画像のアップロードに使用するコードです:

func uploadDocWebservice(fileUrl: NSURL , progressView : PWProgressView , index : String , imageData : NSData? , name : String , mimeType : String , uploadType : String){ 

    let url = "\(kBaseURL)\(uploadDocsUrl)" 

    var type = String() 
    var networkGroupId = String(SingletonClass.sharedInstance.selectedNetworkId!) 

    if SingletonClass.sharedInstance.groupPopUp == true { 

     type = "group" 
     networkGroupId = String(SingletonClass.sharedInstance.selectedSubNetworkOrGroup!) 

    }else { 

     type = "network" 
    } 

    Alamofire.upload(
     .POST, 
     url, 
     multipartFormData: { multipartFormData in 

      if uploadType == "Image" { 
       multipartFormData.appendBodyPart(data: imageData! , name: "file", fileName: name, mimeType: mimeType) 
      }else { 
       multipartFormData.appendBodyPart(fileURL: fileUrl, name: "file") 
      } 
      multipartFormData.appendBodyPart(data:"\(SingletonClass.sharedInstance.tokenId)".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"token") 
      multipartFormData.appendBodyPart(data:"\(type)".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"networkGroup") 
      multipartFormData.appendBodyPart(data:"\(networkGroupId)".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"networkGroupId") 

     }, 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .Success(let upload, _, _): 

       upload.progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in 

        let ratio: Float = Float(totalBytesRead)/Float(totalBytesExpectedToRead) 
        // Call main thread. 
        dispatch_async(dispatch_get_main_queue(), { 
         progressView.progress = ratio 
        }) 

       } 

       upload.responseJSON { response in 

        let dataString = NSString(data: response.data!, encoding:NSUTF8StringEncoding) 
        print(dataString) 

        self.edited = true 

        do{ 

         let json = try NSJSONSerialization.JSONObjectWithData(response.data!, options: .MutableLeaves) as? NSDictionary 

         if let success = json!["success"] as? Int { 

          if success == 1 { 

           let id = json!["response"]!.objectForKey("id") as! String 
           let docName = "\(json!["response"]!.objectForKey("name") as! String).\(json!["response"]!.objectForKey("ext") as! String)" 
           let dic = ["name" : docName , "Id" : id] 
           self.uploadedDocsIdArray.addObject(dic) 
           self.uploadedArrayJustNames.addObject(docName) 
           print(self.uploadedDocsIdArray) 

          }else { 

           // delete image from view here 

          } 

         } 

        }catch{ 

         // delete image from view here 
         invokeAlertMethod("Error", msgBody: "Invalid Json", delegate: self) 

        } 

       } 
      case .Failure(let encodingError): 

       print(encodingError) 
      } 
     } 
    ) 

} 

私はどの結果を知るために取得する場合、私は、ビューからその特定のイメージを削除助けることができること、どの呼び出すことが関連しています。

+0

イメージごとに一意のIDを持つか、各イメージに一意に関連付けられているIDが必要です。たとえば、image-Idsをキーとして、その値をBoolとして含む別々のアップロードトラッキング辞書を持つことができます。最初はすべての値が "false"になります。 image-Idのアップロードが成功するたびに、その値を "true"に設定することができます。 – san

+0

私はすでにこれを試しました。接続やサーバーの障害が発生した場合、失敗したイメージIDは返されません。失敗したイメージは複数のイメージになります。 –

+0

正常にアップロードされた場合は、image-Idを取得しますか? – san

答えて

3

あなたは元のリクエストへの参照を保持する必要があります。私は思うのアップロード要求と同じでなければなりません。次のことを試してみてください。

func uploadDocWebservice(fileUrl: NSURL , progressView : PWProgressView , index : String , imageData : NSData? , name : String , mimeType : String , uploadType : String) -> Request? { 
    return Alamofire.upload ... 
} 

その後、あなたは、単に要求すなわちの配列を持つことができます var requests: [Request]()を。 Alamofire.upload/Alamofire .requestを呼び出すと、Requestオブジェクトが返されます。

ます。次に行うことができます。

var requests: [Request]() 
let request = uploadDocWebservice(...) 
requests.append(request) 

その後することができますだけの配列をループし、あなたが望むものは何でも要求確認してください。

関連する問題