2016-02-02 5 views
9

Ho usato Alamofire per caricare immagini in dati di moduli multipart. Sono riuscito a raggiungere il mio obiettivo. Ogni volta che carico un'immagine, chiamo la funzione "uploadDocWebService". Quindi il numero di volte che la funzione è chiamata, è uguale al numero di immagini. Sono senza speranza nell'individuare il risultato di ogni chiamata. Le mie immagini vengono caricate con successo. Nel caso in cui si verifichi un errore del server o una connessione Internet non riesce, il caricamento non riesce, non riesco a identificare quale immagine dovrei eliminare dalla vista, che non è riuscita. Passo indexPath come parametro per ogni caricamento di immagine. Ma indexPath si aggiorna all'ultimo caricamento dell'immagine prima di ricevere il risultato per il primo caricamento dell'immagine. Qualcuno mi può suggerire un approccio migliore per questa situazione.Chiamate multiple a una richiesta Alamofire, ottenere il riferimento per ogni chiamata

ecco il codice che uso per il caricamento di immagini:

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

} 

Se riesco a conoscere il cui risultato è associata al quale chiamare, che potrebbe aiutarmi a cancellare quell'immagine particolare dalla vista.

+0

È necessario disporre di un ID univoco per ogni immagine OPPURE qualcosa che sia associato in modo univoco a ciascuna immagine. Ad esempio, puoi avere un dizionario di tracciamento del caricamento separato contenente ID immagine come chiavi e il suo valore come Bool. Inizialmente tutti i valori saranno "false". Ogni volta che il caricamento ha esito positivo per un ID immagine, è possibile impostare tale valore su "true". – san

+0

L'ho già provato. Nel caso ci sia una connessione o un errore del server, non verrà restituito l'ID immagine che non è riuscito. Le immagini non riuscite possono essere più di una. –

+0

Ottieni l'ID immagine per il caricamento riuscito? – san

risposta

3

È necessario mantenere un riferimento alla richiesta originale, dovrebbe essere lo stesso per le richieste di caricamento credo. Provare quanto segue:

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

allora si può semplicemente avere una serie di richieste cioè: var requests: [Request](). Quando si chiama Alamofire.upload/Alamofire .request - restituisce un oggetto Request.

È quindi possibile fare:

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

allora si può solo scorrere l'array e controllare qualunque richiesta che si desidera.