iOS: UIWindow.rootViewController должен использоваться только из основного потока

У меня проблема с использованием

if let wd = UIApplication.shared.delegate?.window {
            var vc = wd!.rootViewController

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

UIWindow.rootViewController должен использоваться только из основного потока

И

UIApplication.delegate должен использоваться только из основного потока

Этот класс специально предназначен для загрузки с помощью progressBar.

      public func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
            print("Download finished: \(location)")
...
 do { 
            let result =  try FileManager.default.replaceItemAt(URL(fileURLWithPath: Constants.Path.temp.stringByAppendingPathComponent(path: "temp.zip")), withItemAt: URL(fileURLWithPath: location.path))

            let source = Constants.Path.tempZipFile
            let destination = Constants.Path.temp.stringByAppendingPathComponent(path: "dezipped")
            var myDict = [String:Any]()
            myDict["source"] = source
            myDict["destination"] = destination


            DispatchQueue.main.async { //IF I REMOVE THIS => PB OR THREAD IN MAIN
            if let wd = UIApplication.shared.delegate?.window {
                var vc = wd!.rootViewController
                if(vc is UINavigationController){
                    vc = (vc as! UINavigationController).visibleViewController

                }

                if(vc is WebViewController){
                    NotificationCenter.default.post(name: .DeflatSynchroFilesWebView, object: myDict, userInfo: nil)
                }
                else
                {
                    NotificationCenter.default.post(name: .DeflatSynchroFiles, object: myDict, userInfo: nil)
                }
            }
            }
        } catch let writeError as NSError {
            print("error writing file temp.zip to temp folder")
        }

введите здесь описание изображения Как удалить предупреждение, не вызывая ошибок в моем приложении?

Заранее спасибо.


person ΩlostA    schedule 05.09.2019    source источник
comment
А как насчет DispatchQueue.main.sync?   -  person Sweeper    schedule 05.09.2019
comment
@Sweeper делает то же самое...   -  person ΩlostA    schedule 05.09.2019
comment
Вам нужно будет сообщить нам, что вы подразумеваете под приложением, которое отображается неправильно. В частности, то, что вы ожидаете увидеть, и то, что вы видите на самом деле.   -  person Rudedog    schedule 05.09.2019
comment
@Rudedog проблема в том, что если я использую NotificationCenter.default.post в DispatchQueue.main.sync в urlSession(_ session: URLSession, downloadTask:, приложение плохо запускает код. Дело в том, что мой счетчик не очень хорошо отображается, но это просто не симптом.Главная проблема в том, что код не срабатывает в нужный момент.   -  person ΩlostA    schedule 06.09.2019


Ответы (1)


Я не уверен, что это может помочь, но чтобы получить rootViewController, я всегда использую это:

if let window = UIApplication.shared.keyWindow?.rootViewController {

        }

без делегата

person emelagumat    schedule 05.09.2019
comment
Обратите внимание, что keyWindow устарело в iOS 13. - person rmaddy; 05.09.2019
comment
@emelagumat делает то же самое: D - person ΩlostA; 06.09.2019