0

我使用後臺線程遞歸程序。爲了避免堆棧溢出,我使用計時器。但是我面對Timer + GCD的問題。起火後,定時器調用功能一次並停止。定時器與大中央調度

有小代碼。如果重要,我使用ARC。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
     // Override point for customization after application launch. 


     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^
    { 
      self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerFunction) userInfo:nil repeats:YES]; 
      [self.timer fire]; 
    }); 

    return YES; 
} 


-(void)timerFunction 
    { 
    NSLog(@"Timer Tick"); 

    } 

什麼問題?

對不起,我的英文。謝謝:)

+1

您是否曾將定時器添加到runloop?並運行runloop?爲什麼你需要一個後臺線程讓計時器運行? – Wain

+0

因爲我有很多函數調用自己在後臺(它被稱爲遞歸),並且我的堆棧在3000次調用後浮起,這就是爲什麼我要定時器:退出某些函數並重新啓動它。但是我的計時器沒有理由地停下來。 – IWantToKnow

回答

1

不要做你想做的事情。只需在主線程上運行定時器。定時器還需要在runloop上進行安排(所以請使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:來創建它)。

現在,如果需要,請在時間(timerFunction)調用的方法中使用dispatch_async在後臺線程上執行處理。

+0

謝謝,這是個好主意。我會盡力。 – IWantToKnow