Шаблон Notification-Observer для процесса загрузки файла работает только при большом размере файла - swift? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть одно приложение просмотра, которое загружает изображения на удаленный сервер.Когда пользователь отправляет загрузку, я использую второй контроллер представления, который отображается как пользовательское всплывающее окно и показывает ход загрузки файла.Когда загрузка завершена, пользовательское всплывающее окно раскручивается до первого viewController.Я использую шаблон Noser-Observer для связи между двумя viewControllers.

Моя проблема заключается в следующем: когда я загружаю большие файлы, можно наблюдать индикатор выполнения загрузки, и после завершения загрузки пользовательское всплывающее окно раскручивается.,Когда я загружаю небольшой файл, время загрузки очень велико, даже если файл успешно загружен, прогресс загрузки не наблюдается и пользовательское всплывающее окно не раскручивается (см. Код ниже).

Я не уверен, что настроил шаблон наблюдателя уведомлений правильно?

FIRST VIEWCONTROLLER:

Alamofire.upload(
        multipartFormData: { multipartFormData in
            for(key, value) in sendParamters{
                multipartFormData.append((value.data(using: .utf8)!), withName: key)
            }

            for fileURL in arrayURLToUpload{
                print("fileURL: \(fileURL)")
                multipartFormData.append(fileURL, withName: "file[]")
            }
        },
            to: UPLOAD_URL,
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):

                    /**TRACK PROGRESS OF UPLOAD**/
                    upload.uploadProgress { progress in
                        print("ECNTERFILENAME: \(progress.fractionCompleted)")

                        let progress = progress.fractionCompleted

                        // NOTIFICATION - UPLOAD PROGRESS
                        NotificationCenter.default.post(name: notifcationName, object: nil, userInfo: ["progress": progress])
                    }
                    /***/


                    // 'responseJSON' FIRES WHEN UPLOAD IS COMPLETE
                    // IT ALSO TO FIRES WHEN THE IS INTERNET CONNECTIVITY ISSUES
                    upload.responseJSON { response in


                        // NOTIFICATION UPLOAD COMPLETE
                        NotificationCenter.default.post(name: uploadFinishName, object: nil, userInfo: ["response": response])
                    }


                case .failure(let encodingError):
                    print("UPLOAD ERROR")
                    print(encodingError)
                }
        }
    )

SECOND VIEWCONTROLLER:

override func viewDidLoad() {
    super.viewDidLoad()

    self.createUploadObserver()
    self.createUploadFinishObserver()

    if txtLabelOutlet == nil{ // WHEN IMAGE('tickok') HAS REPLACED 'txtLabelOutlet'
        reformTxtLabel()
    }


    self.infoLabelOutlet.textColor = UIColor.black // CAN BE RED WHEN NETWORK CONNECTION IS LOST
    self.progressOutlet.progress = 0   
}



func createUploadObserver(){
    print("createUploadObserver ..")
    NotificationCenter.default.addObserver(forName: notifcationName, object: nil, queue: OperationQueue.main) { (notification) in

        guard
            var arrayN = notification.userInfo as? [String:Double],
            let num = arrayN["progress"] else{
                print("no valid data")
                return
        }
        // UPDATE PROGRESS BAR
        let progress = Float.init(num)
        self.progressOutlet.progress = progress

        // UPDATE LABEL
        let percent = Int(progress*100)
        print("percent: \(percent)")


        if let progressOut = self.txtLabelOutlet{
            print("OUTLET EXISTS!")
            progressOut.text = "\(percent)%"
        }else{
            print("OUTLET DOES NOT EXIST")
        }
    }
}




func createUploadFinishObserver(){
    print("createUploadFinishObserver ..")

    NotificationCenter.default.addObserver(forName: uploadFinishName, object: nil, queue: OperationQueue.main) { (notification) in

        print("notification.userInfo: \(notification.userInfo)")

        guard let response = notification.userInfo as? [String: DataResponse<Any>] else{
            print("Error completion response")
            return
        }

        guard
            let respObj = response["response"] as? DataResponse<Any>,
            let result = respObj.result as? Result<Any> else{return}


        if let value  = result.value{
            print("value: \(value)")
        }

        if result.description == "SUCCESS"{
            // UPLOAD COMPLETE
            // SHOW VIDEO CAPTURE
            print("upload success")


            if let progressOut = self.txtLabelOutlet{
                print("OUTLET EXISTS - REMOVE FROM SUPERVIEW")
                progressOut.removeFromSuperview()
            }else{
                print("OUTLET DOES NOT EXIST to remove from superview")
            }

            // ADD GREEN TICK IMAGE TO SHOW UPLOAD SUCCESS PROGRAMTICALLY
            let image = UIImage.init(named: "tickok")
            self.showCompleteTickImage(image: image!, completion: {

                // DELAY EXECUTION OF DIMISS POPUP BY 2 SECONDS
                DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                    print("DISMISS PROGRESS POPUP")
                    // DISMISS POUP AND SHOW IMAGE CAPTURE AGAIN
                    self.performSegue(withIdentifier: "inwindme2", sender: self)

                }
            })


        }else{
            // HANDLE UPLOAD FAIL
            print("upload fail")
            self.infoLabelOutlet.text = "Network Connection Lost"
            self.infoLabelOutlet.textColor = UIColor.red
        }
    }
}

1 Ответ

0 голосов
/ 05 декабря 2018

Можно поменять местами

self.createUploadFinishObserver()
self.createUploadObserver()

Поскольку кажется, что popupVC при загрузке небольшого файла еще не был зарегистрирован, поэтому окончание публикации происходит до наблюдения, также вы можете начать загрузку взавершение представления этого всплывающего окна,

self.present(popup,animated:true) {
  // start upload
}

Если segue

self.performSegue(///// 
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  // start upload 
}

Центр уведомлений работает, логика вашего приложения должна быть на 100% уверена в том, что сообщение происходит после наблюдения

...