如果您需要轮询并且想在后台线程上执行此操作,我可能建议使用调度计时器:
@property (nonatomic, strong) dispatch_source_t timer;
然后您可以将此计时器配置为每两秒触发一次:
dispatch_queue_t queue = dispatch_queue_create("com.domain.app.devicepoller", 0);
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(self.timer, dispatch_walltime(NULL, 0), 2.0 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.timer, ^{
[self pollDevice]; // this method should just poll the device and then return; no loop needed in this method
});
dispatch_resume(self.timer);
参见讨论调度来源 https://developer.apple.com/library/mac/documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html#//apple_ref/doc/uid/TP40008091-CH103-SW1 in the 并发编程指南。另请参阅Grand Central Dispatch (GCD) 参考 https://developer.apple.com/library/mac/documentation/performance/reference/gcd_libdispatch_ref/Reference/reference.html.
但是大多数设备都支持某种形式的事件驱动通知,这样就不需要进行任何像这样的轮询,但是如果您必须轮询,并且您想在主线程之外进行轮询,那么这是一种方法。
当您希望计时器在后台队列上运行时,调度计时器非常有用。如果您的供应商的 API 的响应速度足以在主队列中无缝运行,则使用NSTimer
方法。它使您不必做很多额外的工作来使您的代码线程安全(例如,正确的同步 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1当您更新模型对象等时)。我从你最初问题的基于线程的方法中假设你有某种原因不使用计时器,并且由于某种原因你必须将其移动到另一个线程,在这种情况下我认为调度计时器可能是处理它的更好方法比做NSThread
永久编程while
环形。但如果您 (a) 必须进行民意调查; (b) 没有迫切需要编写多线程代码,那么如果您使用过,您的生活可能会更简单NSTimer
基于的方法。
就我个人而言,我会确保我用尽了核心蓝牙 https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonCentralRoleTasks/PerformingCommonCentralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH3-SW1在我追求计时器之前的方法。物理设备的应用程序级轮询应被视为最后手段。也许您可以联系 API 的供应商,看看他们是否有除了轮询之外的建议(因为如果他们已经这样做了一段时间,他们可能有更优雅的解决方案可以建议)。
关于接收网络服务更新,轮询的效率又非常低(并且根据轮询的频率,它可能会对电池寿命产生不利影响,消耗蜂窝数据计划等)。推送通知 https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction.html如果服务器数据不经常更改,但您希望您的应用程序能够主动收到更改通知,那么这可能是一种可行的方法。或者,如果服务器确实在不断变化,那么也许某种基于套接字的方法可能有意义。但是每两秒轮询一次网络资源(如果这就是您的建议)很少是正确的方法。
就像物理设备的轮询是最后手段的架构一样,对于网络通信来说更是如此。您确实希望提出一种能够平衡设备考虑因素和业务需求的架构。如果您得出结论必须采用基于轮询的方法,也许您可能会考虑根据用户是否使用 WiFi 或蜂窝网络而采用不同的轮询频率。