Для загрузки изображений на сервер с помощью Alamofire Multipart в Swift - PullRequest
0 голосов
/ 09 ноября 2019
  1. Во время регистрации пользователя я загружаю некоторые фотографии на сервер. Первый - это фото профиля. А остальные фотографии я хочу загрузить после завершения процесса регистрации. Означает, что я хочу загрузить фотографию после получения идентификатора пользователя и токена доступа. Значит, после успешной загрузки изображения, пользователь войдет в «matchViewController», и тогда начнется только процесс загрузки. Также я хочу загрузить эти фотографии в фоновом потоке. Кроме того, если приложение работает в фоновом режиме, процесс загрузки также должен быть продолжен. Весь процесс загрузки выполняется Alamofire.

  2. При написании следующего кода фотографии загружаются успешно, но это занимает больше времени. Что не очень удобно для пользователя.

  3. Также, пожалуйста, скажите мне, как продолжить процесс загрузки, когда приложение работает в фоновом режиме.

  4. Также, если код не подходит, пожалуйста, помогите мне изменить любые изменения в коде, если это необходимо.

Мой код: -

private func handleRegistration (_ parameterDict : [String : Any]){

    let url = USER_REGISTER_URL
    let headers: HTTPHeaders = [
        "Content-Type": "application/x-www-form-urlencoded"

    ]


    Alamofire.upload(multipartFormData: { (multipartFormData) in
        for (key, value) in parameterDict {

            multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
        }
        let random = randomString(length: 7)
        multipartFormData.append(self.selectedProfilePic.image!.jpegData(compressionQuality: 0.4)!, withName: "fileset",fileName: "\(random).jpg", mimeType: "image/jpg")




    }, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
        switch result{
        case .success(let upload, _, _):
            upload.responseJSON { response in
                print(response)

                var userId: String?
                var token: String?
                if let result = response.result.value {
                    let JSON = result as! NSDictionary



                    guard let accessToken = JSON["access_token"] as? String
                        else{ return }


                    guard let uid = JSON["User_Id"] as? String
                        else{return}
                    userId = uid
                    token = "bearer " + accessToken


                    UserDefaults.standard.set(Int(uid), forKey: "User_Id")
                    UserDefaults.standard.set(token, forKey: "access_token")


                    let phone = JSON["Phone_Number"] as? String
                    let FirstName = JSON["FirstName"] as? String

                    let email = uid + "@gmail.com"
                    let tempDictionary : Dictionary = [kFIRSTNAME : FirstName!, kLASTNAME : "", kFULLNAME : FirstName!, kPHONE : phone!, kREGISTERUSEID: userId, kEMAIL: email] as [String : Any]


                    self.checkDeviceTokenAvailibility(uid: Int(userId!)!)
                    self.startRegistrationWithFirebase( detailDict: tempDictionary)

                    let storyBoard = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainTabbarView")
                    storyBoard.modalPresentationStyle = .fullScreen
                    self.present(storyBoard, animated: true, completion: nil)



                    if let message = JSON["Message"] as? String{

                        if message == "Please Upload a image."{

                        }
                    }

                }

                if userId != nil  && token != nil{



                    self.multiImageUpload(userId: Int(userId!)!, token: token!)
                }
                print("Succesfully uploaded")




                if let err = response.error{
                    //                            onError?(err)
                    //                            print(err.localizedDescription)
                    return
                }
                //                        onCompletion?(nil)
            }
        case .failure(let error):
            print("Error in upload: \(error.localizedDescription)")
            //                    onError?(error)
        }
    }
}

1 Ответ

0 голосов
/ 10 ноября 2019

Один из способов сократить время загрузки - отправить несколько партий одновременно, используя цикл for и используя Alamofire для отправки определенной части. Таким образом, он разбивается на части, отправка которых занимает намного меньше времени. Дело в том, что на стороне сервера вам придется реконструировать образ.

Также, если код не подходит, пожалуйста, помогите мне изменить любые изменения в коде, если это необходимо.

Кажется, в вашем коде много произвольного пространства.

...