2016-02-02 13 views
9

Użyłem Alamofire do przesyłania zdjęć w postaci wieloczęściowych danych. Osiągam sukces w osiąganiu celu. Za każdym razem, gdy ładuję obraz, nazywam funkcję "uploadDocWebService". Tak więc liczba wywołań funkcji jest równa liczbie obrazów. Beznadziejnie identyfikuję wynik każdego połączenia. Moje obrazy zostały pomyślnie przesłane. W przypadku awarii serwera lub błędu połączenia internetowego wysyłanie nie powiedzie się, nie mogę zidentyfikować obrazu, który powinien usunąć z widoku, który się nie powiódł. Przekażę parametr indexPath jako parametr dla każdego przesyłania obrazów. Ale to polecenie IndexPath aktualizuje najnowszy obraz przesyłany, zanim otrzymam wynik pierwszego przesłania obrazu. Czy ktokolwiek może zaproponować mi lepsze podejście do tej sytuacji.Wiele połączeń z żądaniem Alamofire, uzyskaj referencje dla każdego połączenia

Oto kod używać do przesyłania obrazu:

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

} 

Jeśli mogę wiedzieć, który wynik jest związany z którym wezwanie, które mogłyby mi pomóc usunąć ten konkretny obraz z pola widzenia.

+0

Musisz mieć unikalny identyfikator dla każdego obrazu LUB coś, co jest jednoznacznie powiązane z każdym obrazem. Na przykład możesz mieć oddzielny słownik śledzenia przesyłania zawierający identyfikatory obrazów jako klucze i ich wartość jako Bool. Początkowo wszystkie wartości będą "fałszywe". Za każdym razem, gdy przesyłanie powiedzie się dla identyfikatora obrazu, możesz ustawić tę wartość na "true". – san

+0

Próbowałem już tego. W przypadku wystąpienia błędu połączenia lub serwera nie zostanie zwrócony identyfikator obrazu, który się nie powiódł. Obrazy nieudane mogą być więcej niż jeden. –

+0

Czy otrzymujesz identyfikator obrazu do pomyślnego przesłania? – san

Odpowiedz

3

Należy zachować odniesienie do pierwotnego wniosku, powinny być takie same dla wniosków o przesyłanie Myślę, że. Spróbuj wykonać następujące czynności:

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

Następnie można po prostu mieć szereg wniosków tj: var requests: [Request](). Podczas wywoływania Alamofire.upload/Alamofire .request - zwraca obiekt żądania.

Można wtedy zrobić:

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

Następnie można po prostu pętli za pośrednictwem tablicy i sprawdź, co prośba chcesz.

Powiązane problemy