进入主队列后 UI 变得无响应

Posted

技术标签:

【中文标题】进入主队列后 UI 变得无响应【英文标题】:UI becomes non responding after getting from in to the main queue 【发布时间】:2015-10-05 19:37:54 【问题描述】:

我正在尝试从 url 延迟加载图像并在仅在主队列中接收到图像后更新 UI,UI 正在更新但视图变得无响应,我正在使用 GCD 创建一个新的从 URL 获取数据的线程

让 imageUrl : NSURL = NSURL(string: SiteAPIURL + (DEFAULTS.valueForKey(kInviterImageUrl) as!String))!

    let request: NSURLRequest = NSURLRequest(URL: imageUrl)
    SwiftLoader.show(title: "Loading", animated: true)


    let queue  : dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)

  dispatch_async(queue)  () -> Void in
    let data : NSData = NSData(contentsOfURL: imageUrl)!
    let image = UIImage(data: data)!
    dispatch_async(dispatch_get_main_queue(),  () -> Void in
        self.userImage.image   = image
        self.userImageWide.image = image

    )



    

【问题讨论】:

【参考方案1】:

“DISPATCH_QUEUE_PRIORITY_HIGH:分派到队列的项目以高优先级运行;队列被安排在任何默认优先级或低优先级队列之前执行。” 这就是文档中的内容,因此请使用优先级较低的其他内容,因为这可能会阻止默认队列,例如 QOS_CLASS_USER_INITIATED。 这就是你想要的

    if let url = imageUrl
        let qos = Int(QOS_CLASS_USER_INITIATED.rawValue)
        dispatch_async(dispatch_get_global_queue(qos, 0), 
            let data = NSData(contentsOfURL: imageUrl)
            dispatch_async(dispatch_get_main_queue(), 
                if data != nil 
                    if let image = UIImage(data: data)
                        self.userImage.image   = image
                        self.image = UIImage(data: imageData!)
                        self.userImageWide.image = image
                    
                
            )
        )
    

【讨论】:

以上是关于进入主队列后 UI 变得无响应的主要内容,如果未能解决你的问题,请参考以下文章

旋转的 UIView 变得无响应

应用程序没有响应

应用对 NSFetchRequests 无响应

尝试从外部脚本更新进度条时,QWidget 变得无响应[重复]

播放框架变得无响应? (可能是内存问题)

JavaFX/Mac:当我将 useSystemMenuBar 设置为 true 时,系统菜单变得无响应