尽管后台线程中有 运行,但仍解析消息 "Warning: A long-running operation is being executed on the main thread"

Parse message "Warning: A long-running operation is being executed on the main thread" despite running in background thread

我有一段很长的代码可以从 Parse 下载数据。这是简化版:

func runQuery(query:PFQuery) {

    var backgroundQueue = NSOperationQueue()
    backgroundQueue.addOperationWithBlock(){

    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil {

           // ... some stuff here...

           // the following line produces the parse warning. 
           // file is a PFFile object.

           if let imageData = file.getData() {
               // ...
           }

           // even more stuff here ...
     }
}

我知道 PFFile.getData() 会阻塞 运行 线程,但这没关系,因为它在 NSOperationQueue 中运行。所以从我的想法来看,我正在后台处理。它有效,当我调用 runQuery() 时,它立即 returns 并且 UI 有效。 但是到底为什么我会收到这个警告,我怎样才能摆脱它呢? 我不想将 PFFile.GetData() 调用更改为 PFFile.getDataInBackgroundWithBlock(),因为这需要对代码进行重大更改。我认为没有必要。

NSOperationQueue() 会return主操作队列,也就是运行在主线程上。不在后台线程上。

同时,我发现了问题。

query.findObjectsInBackgroundWithBlock { ... }

将块内的代码 放回主队列,即使您是在后台线程上执行它也是如此! 我不知道这是不是故意的。

知道了,解决问题就很简单了:把耗时的下载代码放在一个NSOperationQueue()中,在后台线程中运行。然后你可以使用同步解析方法,这使得代码更容易编写和阅读。 所有警告都消失了。