2017-06-27 24 views
0

スイフト3とアラモファイア4を使用しています。私はforループの中に6つの画像をアップロードしたいが、alamofireのアップロード要求は非同期で実行する。それは、まずループのために実行され、次にアップロードされます。しかし、私は応答を得てから次にアップロードするまで待っています。これどうやってするの?alamofireで画像をアップロードするにはどうすればいいですか?

+1

FYI Alamofireはのために非同期的に実行理由。アップロード(または実際にはネットワークリクエスト)を同期して実行しようとするのは、ほとんどの場合設計上の決定が悪いことです。 – deadbeef

+0

ネットワーク接続が弱すぎて一度に複数のアップロードを処理することができないと心配している場合は、別の方法があります(Alamo Fire 'SessionManager'と' URLSessionConfiguration'には ' httpMaximumConnectionsPerHost'プロパティ。 – deadbeef

答えて

0

画像のアップロードを順次実行するには、DispatchQueueのシリアル番号を使用する必要があります。シリアルキューは一度に1つの要求だけが実行されることを保証し、次の要求は前の要求が実行を終了したときにのみ開始します。

let serialQueue = DispatchQueue(label: "serialQueue") 
for image in images { 
    serialQueue.async{ 
     //upload image with Alamofire here 
    } 
} 
0

モデルクラス

class MultipartUpdataData: NSObject 
{ 
    var mediaData:Data! 
    var mediaUploadKey:String! 
    var fileName:String! 
    var mimeType:String! 
    override init() 
    { 

    } 
    required init(coder aDecoder: NSCoder) { 

     if let mediaData = aDecoder.decodeObject(forKey: "mediaData") as? Data { 

      self.mediaData = mediaData 
     } 
     if let mediaUploadKey = aDecoder.decodeObject(forKey: "mediaUploadKey") as? String { 

      self.mediaUploadKey = mediaUploadKey 
     } 
     if let fileName = aDecoder.decodeObject(forKey: "fileName") as? String { 

      self.fileName = fileName 
     } 
     if let mimeType = aDecoder.decodeObject(forKey: "mimeType") as? String { 

      self.mimeType = mimeType 
     } 
    } 
    open func encodeWithCoder(_ aCoder: NSCoder) 
    { 
     if let mediaData = self.mediaData{ 
      aCoder.encode(mediaData, forKey: "mediaData") 
     } 
     if let mediaUploadKey = self.mediaUploadKey { 
      aCoder.encode(mediaUploadKey, forKey: "mediaUploadKey") 
     } 
     if let mimeType = self.mimeType { 
      aCoder.encode(mimeType, forKey: "mimeType") 
     } 
     if let fileName = self.fileName { 
      aCoder.encode(fileName, forKey: "fileName") 
     } 
    } 

} 

画像をアップロード、まず、次に以下のようにこの関数を呼び出して、配列に画像データを追加してください: -

var uploadMediaList = [MultipartUpdataData]() 
for loop{ 
let multiObject = MultipartUpdataData() 
      multiObject.mediaData = self.pngImageData! 
      multiObject.mimeType = "image/png" 
      multiObject.mediaUploadKey = "profile_pic" //Replace this key with your existing key. 
      let profileFilename = self.filename(Prefix: "profile", fileExtension: "png") 
      multiObject.fileName = profileFilename 
      uploadMediaList.append(multiObject) 
} 
self.upload(uploadMediaList) 

func upload(multipartImages:[MultipartUpdataData]){ 
     let parameters:[String:String] = ["key":"value"] 
     Alamofire.upload(
      multipartFormData: { multipartFormData in 


       for mData in multipartImages!{ 
        let pngImageData = mData.mediaData 
        let uploadfileNamekey = mData.mediaUploadKey 
        let fileName = mData.fileName! 
        let mimeType = mData.mimeType! 
        multipartFormData.append(pngImageData!, withName: uploadfileNamekey!, fileName: fileName, mimeType: mimeType) 

       } 
       for (key, value) in parameters { 
        multipartFormData.append(value.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue), allowLossyConversion: true)!, withName: key) 
       } 

     }, 
      to: "\(url)", 
      encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .success(let upload, _, _): 
        upload.responseJSON { response in 
         let json = JSON(data: response.data!) 

        print("SUCSESS") 

        } 
       case .failure(let encodingError): 
        print("ERORR") 

       } 
     } 
     ) 
    } 
//MARK:-filename- 
    func filename(Prefix:String , fileExtension:String)-> String 
    { 
     let dateformatter=DateFormatter() 
     dateformatter.dateFormat="MddyyHHmmss" 
     let dateInStringFormated=dateformatter.string(from: NSDate() as Date) 
     return NSString(format: "%@_%@.%@", Prefix,dateInStringFormated,fileExtension) as String 
    } 
関連する問題