无论如何,无论该方法是否完全执行,我都可以摆脱一种方法。我需要它只运行 4 秒。有没有办法做到这一点?
编辑:
如果我正在尝试检查主机的可达性,这需要花费太多时间进行检查并且意味着我真的希望来自可达性的反馈更进一步,我该怎么做。如果需要超过 4 秒,我想取消可达性检查,并且我想继续我的应用程序在离线模式下工作。我真的不希望我的用户等待某个时间,直到我从 Reachabiltiy 获得反馈。
无论如何,无论该方法是否完全执行,我都可以摆脱一种方法。我需要它只运行 4 秒。有没有办法做到这一点?
编辑:
如果我正在尝试检查主机的可达性,这需要花费太多时间进行检查并且意味着我真的希望来自可达性的反馈更进一步,我该怎么做。如果需要超过 4 秒,我想取消可达性检查,并且我想继续我的应用程序在离线模式下工作。我真的不希望我的用户等待某个时间,直到我从 Reachabiltiy 获得反馈。
您已经更新了您的问题,以澄清您正在处理可达性问题。我可能建议如下:
将您的控制器添加为Apple 的可达性代码kReachabilityChangedNotification
中所示的观察者。
创建您的Reachability
对象并启动通知程序:
self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"];
[self.hostReach startNotifier];
创造你的 4 秒NSTimer
。
显示表明您正在尝试与服务器建立连接的 UI。例如,至少,您希望在 UI 前面有一些视图来阻止用户与您的应用程序交互,并且您可能需要一个UIActivityViewIndicator
让用户知道应用程序正忙于做某事的视图。
等待您的计时器关闭或Reachability
通知触发。
无论哪种情况,您都可以停止可达性通知程序,删除您在第 4 步中显示的 UI,然后根据需要离线或在线继续。显然,如果你在计时器之前得到了可达性通知,你可能也想要invalidate
你的四秒计时器。
原答案:
您通常必须自己编写类似的程序,这取决于您的方法。例如,这很容易使用 a 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
orNSOperationQueue
并发性,您将获得-cancel
并-isCancelled
内置到它们中,它们的功能与此处描述的完全一样。
在方法中使用计时器...
NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 4.0 target: self
selector: @selector(myMethod:) userInfo: nil repeats: NO];
所以 4 秒后,你可以调用一个方法来处理离线模式。
在您希望 4 秒后结束的方法中,您检查计时器是否无效使用
[NSTimer isValid]