为什么我的NSOperationQueue在主线程上运行?

时间:2015-02-27 13:33:41

标签: ios multithreading swift parse-platform

我已经设置了一个操作队列:

func initialiseOperationQueue(){
    self.operationQueue = NSOperationQueue()
    self.operationQueue.name = "General queue"
    self.operationQueue.maxConcurrentOperationCount = 2

}

然后我在队列中添加了一个操作

let op = HPSyncDataOperation(type: HPSyncDataOperationType.OnlineRecord, delegate: self, date: self.latestLastUpdateAt)
self.operationQueue.addOperation(op)

基本上使用Parse框架在线异步下载一些记录数据。它的实现如下:

PFCloud.callFunctionInBackground("recordPosts", withParameters: param, block: { (objects:AnyObject!, error:NSError!) -> Void in
   if error == nil {
       let dataObjects = objects as [PFObject]

       //TROUBLE HERE:
       for object in dataObjects {
            object.pinWithName("Received Posts")
       }
       //abcdefg
   }
})

但是在执行中,当object.pinWithName("Received Posts")运行时,它会调用

Warning: A long-running operation is being executed on the main thread.

是否应该在单独的线程上运行操作?所以pinWithName,无论其同步还是异步,都应该在一个单独的线程上运行?

请帮忙!为什么是这样?

1 个答案:

答案 0 :(得分:1)

您的操作将在后台线程上运行,但它所做的只是启动另一个异步进程(PFCloud.callFunctionInBackground),它将启动另一个线程。当其他进程完成时,它会在主线程上调用完成块。

所以,在这种情况下,你的操作和队列基本上什么也没做,而且你应该把调用的结果带到PFCloud.callFunctionInBackground(即objects)并在后台线程处理它它可能很耗时。