Xcode UIView.init(frame:) must be used from main thread only

前端 未结 3 1886
时光取名叫无心
时光取名叫无心 2020-12-28 13:31

I\'m trying to render some views in background thread to not affect the main thread. That was never a problem before Xcode 9.

DispatchQueue.global(qos: .back         


        
相关标签:
3条回答
  • 2020-12-28 13:39

    Xcode 9 has a new runtime Main Thread Checker that detects call to UIKit from a background thread and generate warnings.

    I know its meant to generate warnings and not crash the app, but you can try disabling Main Thread Checker for your test target.

    I tried this code in a sample project, the debugger paused at the issue (as it is supposed to), but the app didn't crash.

    override func viewDidLoad() {
        super.viewDidLoad()
    
        DispatchQueue.global().async {
            let v = UIView(frame: .zero)
        }
    }
    
    0 讨论(0)
  • 2020-12-28 13:57

    You can use this function

    func downloadImage(urlstr: String, imageView: UIImageView) {
        let url = URL(string: urlstr)!
        let task = URLSession.shared.dataTask(with: url) { data, _, _ in
            guard let data = data else { return }
            DispatchQueue.main.async { // Make sure you're on the main thread here
                imageview.image = UIImage(data: data)
            }
        }
        task.resume()
    }
    

    How to use this function?

    downloadImage(urlstr: "imageUrl", imageView: self.myImageView)
    
    0 讨论(0)
  • 2020-12-28 14:00

    Main Thread Entry

    You can enter the main thread as follows

    DispatchQueue.main.async { 
        // UIView usage
    }
    
    0 讨论(0)
提交回复
热议问题