2011-12-16 132 views
0

我想知道如果我可以讓iOS程序停留在循環中,而UI仍然有效。無限循環UI

例如:

while (1) { 
    //do some calc here 
    Application.ProcessMessages(); 
} 

這裏的程序停留在一個循環,並以更新屏幕,並獲得用戶界面點擊,滾動等使用Application.ProcessMesages()

是什麼像IOS可能這樣做,也許通過使用某種形式的RunLoop?

我嘗試使用這樣的runLoop,它有一段時間的工作,然後最終根據DoSomeWork(...)正在做什麼例如從互聯網上下載的東西凍結。

while(1) { 
    DoSomeWork(....); 
    CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES); 
} 

我知道還有其他的做事方式,但我想知道這樣的事情是否可以在IOS中工作?

或者你知道什麼可能導致凍結?

感謝

+0

在您找到解決方案之前,您應該首先詢問這是否實際上是必要的。在現代編程中很少需要持久輪詢。 – 2011-12-17 11:17:20

回答

1

的UI運行在主線程,如果你ahve一個無限循環的主線程它會阻止這樣做的工作,你需要生成一個不同的線程才能做的工作,當你需要更新UI你應該這樣做在主線程UIKit是不是線程安全的...這裏是一個例子,如何實現這個,在我的例子中線程正在催生一個選擇器(你可以創建NSThread的子類if你想爲好)

NSThread *sendThread=[[NSThread alloc] initWithTarget:self selector:@selector(aSelector) object:nil]; 
[sendThread start]; 

-(void)aSelector 
{ 
    //do some work 
    //if you want to update the UI you should do so like so on the main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //do stuff on main thread 

    }); 
} 

也有NSObject performSelectorOnMainThread,也將有同樣的效果,請注意,如果你調用迪從主線程中spatch主線程隊列將被阻塞和鎖定。

Hoope this helps

+0

爲什麼主循環會阻塞它是否調用RunLoop函數,runLoop函數是否會在主循環中處理任何事件(即使它也在主循環中),通過調用RunLoop再次遞歸調用主循環?這不會創建另一個線程來處理主線程上的任何事件嗎? – 2011-12-16 18:45:44

0

UI'不起作用'。您呈現一個視圖,並設置一個或多個處理按鈕按下或其他的操作。您可以啓動一個或多個其他線程來偵聽來自網絡的消息,位置,電池電量低等其他事件,併爲其命名。應該不需要像在CP/M的舊時代那樣的輪詢循環。

0

不,您不能在主UI線程中停留在無限循環中,也不會讓UI鎖定或讓操作系統殺死您的應用程序。您必須在另一個線程上運行處理循環,或者將處理分解爲只需要幾分之一秒的塊,然後使用隊列或計時器來安排這些短操作。

您的後臺處理線程可以發送performSelecterOnMainThread請求更新到屏幕。