2014-10-07 34 views
0

我发现了很多有关这个话题的帖子,不过我会继续做一些错误......为什么PFQuery.cancel()作为parse.com-Framework的一部分不起作用?

创建query,PFQuery的实例后,该请求被实现为query.findObjects()(运行在后台线)。在该请求期间,我无法取消像我期望的方法query.cancel()那样的过程。

场景:缺少Internet连接,query.findObjects()尝试连接,失败,再次尝试。我实现了query.cancel(),它在请求首次失败时执行(在所提及的点执行的if objects == nil中),仍然需要第二次尝试。第二次尝试后 - 每个人都需要15秒左右 - 失败,但不会触发第三次。

为什么会发生这种情况,为什么在调用query.cancel()时过程不会中断?

感谢您的帮助!

编辑1:一些代码

func getPost() { 

    let queue = dispatch_queue_create("SerialBgQueue", DISPATCH_QUEUE_SERIAL) 

    dispatch_async(queue, { 

     var query = PFQuery(className: "Post") 

     var objects = query.findObjects() 

     if objects != nil { 

      // do something 

     } else { 

      println("This part is executed now") 

      // doesn't stop the ongoing (second) connection attempt: 
      query.cancel() 

      // do something 

      return 
     } 
    }) 
} 

编辑2:这是日志 - 对我来说,它看起来像尝试的第二束,检查日志(2企图,3,4,...然后开始再次2,3,4 ...)。 else {-部分在中间执行一次,最后一次执行第二次。之后,一切都停止了,不再有“企图”。

2014-10-08 13:37:10.104 Instagram[9210:391955] Error: Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline." UserInfo=0x7fe708c545c0 {NSUnderlyingError=0x7fe708c53020 "The Internet connection appears to be offline.", NSErrorFailingURLStringKey=https://api.parse.com/2/find, NSErrorFailingURLKey=https://api.parse.com/2/find, _kCFStreamErrorDomainKey=12, _kCFStreamErrorCodeKey=8, NSLocalizedDescription=The Internet connection appears to be offline.} (Code: 100, Version: 1.3.0) 

2014-10-08 13:37:10.105 Instagram[9210:391952] Network connection failed. Making attempt 2 after sleeping for 1.092226 seconds. 

2014-10-08 13:37:11.311 ... (Code: 100, Version: 1.3.0) // same Error like in the very first line 

2014-10-08 13:37:11.312 Instagram[9210:391945] Network connection failed. Making attempt 3 after sleeping for 2.184451 seconds. 

2014-10-08 13:37:13.704 ... (Code: 100, Version: 1.3.0) 

2014-10-08 13:37:13.704 Instagram[9210:391952] Network connection failed. Making attempt 4 after sleeping for 4.368902 seconds. 

2014-10-08 13:37:18.514 ... (Code: 100, Version: 1.3.0) 

2014-10-08 13:37:18.514 Instagram[9210:391952] Network connection failed. Making attempt 5 after sleeping for 8.737804 seconds. 

2014-10-08 13:37:27.257 ... (Code: 100, Version: 1.3.0) 

This part is executed now 

2014-10-08 13:37:27.265 ... (Code: 100, Version: 1.3.0) 

2014-10-08 13:37:27.266 Instagram[9210:392183] Network connection failed. Making attempt 2 after sleeping for 1.387503 seconds. 

2014-10-08 13:37:28.792 ... (Code: 100, Version: 1.3.0) 

2014-10-08 13:37:28.793 Instagram[9210:392202] Network connection failed. Making attempt 3 after sleeping for 2.775006 seconds. 

2014-10-08 13:37:31.843 ... (Code: 100, Version: 1.3.0) 

2014-10-08 13:37:31.844 Instagram[9210:392205] Network connection failed. Making attempt 4 after sleeping for 5.550011 seconds. 

2014-10-08 13:37:37.401 ... (Code: 100, Version: 1.3.0) 

2014-10-08 13:37:37.401 Instagram[9210:392202] Network connection failed. Making attempt 5 after sleeping for 11.100023 seconds. 

2014-10-08 13:37:49.050 ... (Code: 100, Version: 1.3.0) 

This part is executed now 
+0

你能发布代码吗? – danh 2014-10-07 19:12:06

+0

@danh当然! – 2014-10-07 22:14:10

+0

“(第二次)连接尝试”是什么意思? 'query'之后是否有另一个查询? – 2014-10-07 23:24:11

回答

1

我想你对findObjects()的假设是不正确的。该变体阻塞了它启动的线程(后台线程在发布的情况下),并且在成功或失败时返回。当您拨打取消电话时,您的代码中没有任何内容可以取消。

典型取消模式是当代码开始在不同的线程查询,然后决定其需要取消,这样(在Objective-C ...对不起)

PFQuery *query = [PFQuery queryWithClassName:@"Post"];  
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    // this block might get called more than once, depending on the cache policy 
    // but it will be called with an error only once and stop after that 
    // (no second attempt that I know about) so as far as I can tell, there's 
    // no reason to ever call cancel here. 
}]; 

说你别不希望查询花费超过10秒的时间。然后...

[query performSelector:@selector(cancel) withObject:nil afterDelay:10.0]; 
+0

我必须保留'findObjects()',因为稍后会有更多代码需要等待查询完成但不能写入'... inBackgroundWithBlock'部分(至少在我目前的经验级别)。无论如何,我会接受你的意见并继续努力。也许我的编辑2与日志给出了一些进一步的信息。 – 2014-10-08 11:59:23

+0

我需要在我的示例中实现performSelector,以便获得期望的效果? – 2014-10-08 22:39:26

+0

如果您使用... inBackgroundWithBlock种类的查找,那么performSelector会有意义,然后您可以将该行放在它之后。如果解析在其重试时真的阻塞了这个后台线程,你可以保留一个标志并取消iOS线程。见例如这里http://stackoverflow.com/questions/10066897/objective-c-cancel-a-dispatch-queue-using-ui-event – danh 2014-10-08 23:04:54

相关问题