2016-02-02 16 views
9

Tôi đã sử dụng Alamofire để tải lên hình ảnh trong dữ liệu biểu mẫu nhiều phần. Tôi thành công trong việc đạt được mục tiêu của mình. Mỗi khi tôi tải lên một hình ảnh, tôi gọi hàm "uploadDocWebService". Vì vậy, số lần hàm được gọi, bằng với số lượng hình ảnh. Tôi vô vọng trong việc xác định kết quả của mỗi cuộc gọi. Hình ảnh của tôi được tải lên thành công. Trong trường hợp có sự cố máy chủ hoặc lỗi kết nối internet không tải lên được, tôi không thể xác định hình ảnh nào tôi nên xóa khỏi chế độ xem, điều đó đã thất bại. Tôi vượt qua indexPath như một tham số cho mỗi tải lên hình ảnh. Nhưng indexPath đó sẽ cập nhật lên hình ảnh tải lên mới nhất trước khi tôi nhận được kết quả tải lên hình ảnh đầu tiên. Có thể ai đề nghị tôi một cách tiếp cận tốt hơn cho tình huống này.Nhiều cuộc gọi đến yêu cầu Alamofire, nhận tham chiếu cho mỗi cuộc gọi

Đây là mã tôi sử dụng để tải lên hình ảnh:

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

} 

Nếu tôi nhận được để biết mà kết quả có liên quan để mà gọi, mà có thể giúp tôi xóa hình ảnh cụ thể khỏi tầm nhìn.

+0

Bạn cần có id duy nhất cho mỗi hình ảnh HOẶC một thứ gì đó được liên kết duy nhất với từng hình ảnh. Ví dụ: bạn có thể có một từ điển theo dõi tải lên riêng biệt chứa các ID hình ảnh làm khóa và giá trị của nó dưới dạng Bool. Ban đầu tất cả các giá trị sẽ là "sai". Bất cứ khi nào tải lên thành công cho một Id hình ảnh, bạn có thể đặt giá trị đó thành "true". – san

+0

Tôi đã thử điều này. Trong trường hợp có kết nối hoặc lỗi máy chủ, tôi sẽ không được trả lại id hình ảnh không thành công. Hình ảnh không thành công có thể nhiều hơn một hình ảnh. –

+0

Bạn có nhận được hình ảnh-Id để tải lên thành công không? – san

Trả lời

3

Bạn cần giữ tham chiếu đến yêu cầu ban đầu, phải giống nhau đối với các yêu cầu tải lên mà tôi nghĩ. Hãy thử như sau:

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

Sau đó, bạn chỉ có thể có một loạt các yêu cầu tức là: var requests: [Request](). Khi gọi Alamofire.upload/Alamofire .request - nó trả về một đối tượng Request.

Sau đó bạn có thể làm:

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

Sau đó, bạn có thể chỉ lặp qua mảng và kiểm tra bất cứ yêu cầu bạn muốn.

Các vấn đề liên quan