无论如何,我可以出来的方法,无论该方法是否完全执行或不。我需要它只能跑4秒。无论如何要做到这一点?做一个方法只能运行一段时间
编辑:
如果我试图检查主机这需要太多的时间在检查的可达性和平均同时,我真的想从可达性的反馈,以进一步我可以在此做什么去了。 我想取消可达性检查,如果它需要更多的4秒,我想继续我的应用程序在离线模式下工作。我真的不希望我的用户等待一段时间,直到我收到Reachabiltiy的反馈。
无论如何,我可以出来的方法,无论该方法是否完全执行或不。我需要它只能跑4秒。无论如何要做到这一点?做一个方法只能运行一段时间
编辑:
如果我试图检查主机这需要太多的时间在检查的可达性和平均同时,我真的想从可达性的反馈,以进一步我可以在此做什么去了。 我想取消可达性检查,如果它需要更多的4秒,我想继续我的应用程序在离线模式下工作。我真的不希望我的用户等待一段时间,直到我收到Reachabiltiy的反馈。
你已经更新了你的问题,以澄清你正在处理可达性。我可能会建议如下:
添加您的控制器作为kReachabilityChangedNotification
的观察者,如图Apple's Reachability code。
创建Reachability
对象,并开始通知:
self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"];
[self.hostReach startNotifier];
创建4秒NSTimer
。
提供用户界面,指示您正尝试与服务器建立连接。例如,您至少需要在界面前观看一些视图,以防止用户与您的应用进行交互,并且您可能需要一个UIActivityViewIndicator
,让用户知道该应用正在忙于做些什么。
等待您的计时器关闭或Reachability
通知触发。
然后,您可以停止可达性通知程序,删除您在步骤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
});
});
此外,它完全取决于你想要做的。
你必须自己安排。在您长期运行的方法中,定期检查“取消”标志:
while (![context isCancelled] || workIsFinished) {
[self nextPartOfTimeConsumingWork];
}
如果您发现已设置此标志,请停止工作。然后,您可以在运行定时器的某些外部代码中设置此标志。
如果使用NSThread
或NSOperationQueue
并发,你会得到-cancel
和-isCancelled
内置了这里描述的做完全。
使用方法的一计时器...
NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 4.0 target: self
selector: @selector(myMethod:) userInfo: nil repeats: NO];
那么4秒钟后,你可以调用一个方法来处理离线模式。
在你想约4秒后结束加时赛的方法,你如果计时器无效使用
[NSTimer isValid]
请详细说明您的需求检查。我担心它太普通了..它可以被关闭! – Devarshi
感谢您澄清您的问题。请参阅我的[修改后的答案](http://stackoverflow.com/a/16851316/1271826),其中概述了如何使用通知和计时器的组合来实现所需的UX。 – Rob