我剛剛創建使用NSRunLoop
和NSTimer
帶有計時器的後臺任務在我ViewController
:停止NSRunLoop在全局隊列
- (void)runBackgroundTask: (int) time{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(startTrackingBg) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
});
}
要調用一個函數將驗證令牌有效性等是否有可能從函數內部結束這個循環?例如:
-(void)startTrackingBg
{
if(TOKEN IS NOT VALID)
{
STOP_THREAD;
dispatch_sync(dispatch_get_main_queue(), ^{
[self alertStatus:@"Session Lost!" :@"Error!"];
[self popToLogin];
});
}
}
我想創建一個後臺程序來驗證每X秒令牌的狀態(使我的REST調用服務器) – 2014-10-30 11:49:09
@DiogoMendonça我更新了我的答案來說明如何您可以設置定時器來執行的東西在後臺隊列上不創建新的運行循環。順便說一句,雖然,你幾乎肯定不想在這種情況下使用計時器。你可能希望在事先請求完成之後手動'dispatch_after'(你不希望緩慢的服務器導致大量的請求積壓,例如,如果你每20秒請求一次,服務器需要60秒才能回覆任何一種或者原因,最終可能會有巨大的積壓)或者使用完全不同的體系結構(套接字,推送通知等)。 – Rob 2014-10-30 11:51:20
我會嘗試找到dispatch_after的一些例子,但他們都似乎非常相似xD – 2014-10-30 12:26:15