尽管后台线程中有 运行,但仍解析消息 "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()中,在后台线程中运行。然后你可以使用同步解析方法,这使得代码更容易编写和阅读。
所有警告都消失了。
我有一段很长的代码可以从 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()中,在后台线程中运行。然后你可以使用同步解析方法,这使得代码更容易编写和阅读。 所有警告都消失了。