2016-02-02 12 views
9

Çok yollu form verilerinde resim yüklemek için Alamofire kullandım. Hedefime ulaşmada başarılıyım. Her görüntüyü yüklediğimde "uploadDocWebService" işlevini çağırırım. Böylece, işlevin çağrılma sayısı, görüntü sayısına eşittir. Her aramanın sonucunu belirlerken umutsuzum. Resimlerim başarıyla yüklendi. Bir sunucu arızası veya yükleme başarısız olduğunda internet bağlantısı başarısız olursa, görüntüden hangi görüntüyü silmem gerektiğini belirleyemiyorum, bu da başarısız oldu. Her bir resim yüklemesi için indexPath parametresini geçiririm. Ancak, ilk resim yüklemesinin sonucunu almadan önce, bu dizinYolu en son resim yüklemesini günceller. Herhangi biri bana bu durum için daha iyi bir yaklaşım önerebilir. Bir Alamofire isteğine yapılan birden fazla çağrı, her bir çağrı için referans alın

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

} 

Bilmek alırsanız

hangi çağırmak için ilişkili sonuç, hangi beni görünümden söz konusu görüntüyü silmek yardımcı olabilir: Burada

Ben resim yüklemesi için kullanmak koddur.

+0

Her bir görüntü için benzersiz bir kimliğiniz VEYA her görüntü ile benzersiz bir şekilde ilişkilendirilmiş bir şeyiniz olması gerekir. Örneğin, anahtar olarak image-Ids ve bir Boole değeri içeren ayrı bir yükleme izleme sözlüğüne sahip olabilirsiniz. Başlangıçta tüm değerler "yanlış" olacaktır. Bir görüntü kimliği için yükleme başarılı olduğunda, bu değeri "doğru" olarak ayarlayabilirsiniz. – san

+0

Bunu daha önce denedim. Bir bağlantı veya sunucu hatası olması durumunda, başarısız olan görüntü kimliğine geri dönmeyeceğim. Başarısız görüntüler birden fazla olabilir. –

+0

Başarılı bir yükleme için resim kimliği alıyor musunuz? – san

cevap

3

Asıl isteğinize bir referans tutmak gerekir, bence yükleme istekleri için aynı olmalıdır. Aşağıdaki deneyin:

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

Sonra sadece istekleri bir dizi olabilir yani: var requests: [Request](). Alamofire.upload/Alamofire .request öğesini çağırırken - Request nesnesini döndürür.

Sonra yapabilirsiniz:

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

Sonra yapabilirsiniz sadece dizisinde ilerleyebilir ve dilediğiniz istek kontrol edin.

İlgili konular