2013-05-31 40 views
-1

无论如何,我可以出来的方法,无论该方法是否完全执行或不。我需要它只能跑4秒。无论如何要做到这一点?做一个方法只能运行一段时间

编辑:

如果我试图检查主机这需要太多的时间在检查的可达性和平均同时,我真的想从可达性的反馈,以进一步我可以在此做什么去了。 我想取消可达性检查,如果它需要更多的4秒,我想继续我的应用程序在离线模式下工作。我真的不希望我的用户等待一段时间,直到我收到Reachabiltiy的反馈。

+0

请详细说明您的需求检查。我担心它太普通了..它可以被关闭! – Devarshi

+0

感谢您澄清您的问题。请参阅我的[修改后的答案](http://stackoverflow.com/a/16851316/1271826),其中概述了如何使用通知和计时器的组合来实现所需的UX。 – Rob

回答

4

你已经更新了你的问题,以澄清你正在处理可达性。我可能会建议如下:

  1. 添加您的控制器作为kReachabilityChangedNotification的观察者,如图Apple's Reachability code

  2. 创建Reachability对象,并开始通知:

    self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"]; 
    [self.hostReach startNotifier]; 
    
  3. 创建4秒NSTimer

  4. 提供用户界面,指示您正尝试与服务器建立连接。例如,您至少需要在界面前观看一些视图,以防止用户与您的应用进行交互,并且您可能需要一个UIActivityViewIndicator,让用户知道该应用正在忙于做些什么。

  5. 等待您的计时器关闭或Reachability通知触发。

  6. 然后,您可以停止可达性通知程序,删除您在步骤4中显示的用户界面,然后根据需要脱机或联机进行操作。很明显,如果你在定时器之前得到了Reachability通知器,你也可能想要你的四秒定时器。


原来的答复:

您通常需要编写这样的事情自己,它取决于你的方法做了什么。例如,对于NSURLConnection(您可以设置一个连接的cancel)的计时器,或者如果您有一个使用for循环的方法,您可以通过查看CFAbsoluteTimeGetCurrent()来检查所用时间,一些较早的价值。我完全依赖于你的方法在做什么。

另一种方法是将其发送到某个后台线程,这样,您可能不会太在意该方法的时间。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // do some time consuming process 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // all UI updates should be dispatched back to the main queue 
    }); 
}); 

此外,它完全取决于你想要做的。

2

你必须自己安排。在您长期运行的方法中,定期检查“取消”标志:

while (![context isCancelled] || workIsFinished) { 
    [self nextPartOfTimeConsumingWork]; 
} 

如果您发现已设置此标志,请停止工作。然后,您可以在运行定时器的某些外部代码中设置此标志。

如果使用NSThreadNSOperationQueue并发,你会得到-cancel-isCancelled内置了这里描述的做完全。

0

使用方法的一计时器...

NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 4.0 target: self 
            selector: @selector(myMethod:) userInfo: nil repeats: NO]; 

那么4秒钟后,你可以调用一个方法来处理离线模式。

在你想约4秒后结束加时赛的方法,你如果计时器无效使用

[NSTimer isValid] 
相关问题