私はマルチパートフォームデータで画像をアップロードするために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)
}
}
)
}
私はどの結果を知るために取得する場合、私は、ビューからその特定のイメージを削除助けることができること、どの呼び出すことが関連しています。
イメージごとに一意のIDを持つか、各イメージに一意に関連付けられているIDが必要です。たとえば、image-Idsをキーとして、その値をBoolとして含む別々のアップロードトラッキング辞書を持つことができます。最初はすべての値が "false"になります。 image-Idのアップロードが成功するたびに、その値を "true"に設定することができます。 – san
私はすでにこれを試しました。接続やサーバーの障害が発生した場合、失敗したイメージIDは返されません。失敗したイメージは複数のイメージになります。 –
正常にアップロードされた場合は、image-Idを取得しますか? – san