2011-12-16 12 views
0

UIが動作している間に、ループ内にあるiOSプログラムを使用できるかどうかは疑問だ。例えば無限ループUI

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

ここでプログラムがループにとどまり、及び(Application.ProcessMesagesを使用しています)ため、画面を更新し、UIのクリックを見るには、スクロールなど

は何ですこれはIOSで可能なのでしょうか、多分何らかの形のRunLoopを使っていますか?

このようなrunLoopを使用してみましたが、いつか動作します。その後、DoSomeWork(...)がインターネットから何かをダウンロードしている場合にUIがフリーズします。

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

私は、他のやり方があることは知っていますが、このようなことがIOSでうまくいくかどうか疑問に思っていましたか?

または、フリーズの原因を知っていますか?

おかげ

UIは、あなたがそれをブロックするメインスレッドで仕事をして無限ループをahve場合、あなたはあなたが必要とするとき、仕事をするために、異なるスレッドを生成する必要があり、メインスレッド上で実行されます
+0

解決策を見つける前に、まずこれが実際に必要かどうかを尋ねる必要があります。永続的なポーリングは、現代のプログラミングではめったに必要ありません。 –

答えて

1

UIを更新するには、UIKitはスレッドセーフではないので、メインスレッドで行う必要があります。ここでは、これを実現する方法の例を示します。私の例では、スレッドがセレクタに生成されています(NSThreadのサブクラスを作成できますまた、あなたはディを呼び出した場合ことに注意し、同じ効果を持つことになりますNSObject performSelectorOnMainThreadもあり

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 

    }); 
} 

)にも希望します主スレッドからメインスレッドキューを読み込み、ブロックしてロックします。

これは役に立ちます

+0

メインループブロックは、RunLoop関数を呼び出すとrunLoop関数がメインループのすべてのイベントを処理しないため、メインループ上にあるにもかかわらず、ループルーンを呼び出してメインループを再帰的に呼び出すのはなぜですか?これは、メインスレッド上のイベントを処理する別のスレッドを作成しませんか? –

+0

メイン実行ループのものが正しいとスケジュールしていますか?彼らは何をしているのか(つまり、何かをダウンロードするには時間がかかります)、メイン(UI)スレッドをブロックします。どうしてこのようなことをしようとしていますか? – Daniel

+0

UI実行ループを呼び出す唯一の適切な方法は、ループルーチンから戻ることです。 – hotpaw2

0

UIが動作しません。ビューを表示し、ボタンの押下などで動作する1つ以上のハンドラを設定します。ネットワーク、場所、バッテリー残量などのメッセージなど、他のイベントをリッスンする1つ以上のスレッドを開始することができます。 CP/Mの昔のようなポーリングループは必要ありません。

0

いいえ、メインのUIスレッドで無限ループに留まることはできません。また、UIがロックされたり、OSがアプリケーションを終了させたりすることはできません。処理ループを別のスレッドで実行するか、処理を数秒しかかからないチャンクに分割し、これらの短い操作をキューまたはタイマーでスケジュールする必要があります。

あなたのバックグラウンド処理スレッドはperformSelecterOnMainThreadを送信して画面に更新を要求できます。