Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 对Alamofire请求的多个调用,获取每个调用的引用_Ios_Iphone_Xcode_Swift_Alamofire - Fatal编程技术网

Ios 对Alamofire请求的多个调用,获取每个调用的引用

Ios 对Alamofire请求的多个调用,获取每个调用的引用,ios,iphone,xcode,swift,alamofire,Ios,Iphone,Xcode,Swift,Alamofire,我使用Alamofire上传多部分格式数据中的图像。我成功地实现了我的目标。每次上传图像时,我都调用“uploadDocWebService”函数。因此,调用函数的次数等于图像的数量。我无法确定每次通话的结果。我的图像已成功上载。如果出现服务器故障或internet连接故障,上传失败,我无法确定应该从视图中删除哪个已失败的图像。我将indexPath作为每个图像上载的参数传递。但是在我收到第一次图像上传的结果之前,indexath会更新到最新的图像上传。有谁能给我一个更好的方法来解决这个问题吗

我使用Alamofire上传多部分格式数据中的图像。我成功地实现了我的目标。每次上传图像时,我都调用“uploadDocWebService”函数。因此,调用函数的次数等于图像的数量。我无法确定每次通话的结果。我的图像已成功上载。如果出现服务器故障或internet连接故障,上传失败,我无法确定应该从视图中删除哪个已失败的图像。我将indexPath作为每个图像上载的参数传递。但是在我收到第一次图像上传的结果之前,indexath会更新到最新的图像上传。有谁能给我一个更好的方法来解决这个问题吗

以下是我用于图像上传的代码:

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)
            }
        }
    )

}

如果我知道哪个结果与哪个调用关联,这可以帮助我从视图中删除特定的图像。

您需要保留原始请求的引用,我认为上传请求应该是相同的。请尝试以下操作:

func uploadDocWebservice(fileUrl: NSURL , progressView : PWProgressView , index : String , imageData : NSData? , name : String , mimeType : String , uploadType : String) -> Request? {
    return Alamofire.upload ...
}
然后,您可以简单地拥有一个请求数组,即:
var请求:[请求]()
。调用Alamofire.upload/Alamofire.request时,它返回一个请求对象

然后,您可以执行以下操作:

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

然后,您只需在数组中循环并检查您想要的任何请求。

您需要为每个图像或与每个图像唯一关联的对象设置唯一的id。例如,您可以有一个单独的上载跟踪字典,其中包含图像ID作为键,其值作为Bool。最初,所有值都将为“false”。每当上传图像Id成功时,您可以将该值设置为“true”。我已经尝试过了。如果存在连接或服务器故障,我将不会返回失败的映像id。失败的图像可以不止一个。您是否获得成功上载的图像Id?是的,我获得成功上载的图像Iduploads@AmritSidhu您之前提到,您可以获得成功上载的图像id。如果这仍然是真的,你不需要标记请求——一旦你收到成功,你就会知道哪些请求成功了。然后,在完成所有请求后,您可以检查成功图像下载的集合/阵列中缺少哪些。要检查多个请求何时完成,我将签出
dispatch\u group
,以便在一组任务完成时收到通知。RayWenderlich是调度组的一个很好的例子