web-dev-qa-db-ja.com

Objective-C / CocoaのJavaのThread.sleep()に相当するものは何ですか?

Java Thread.sleep()を使用して、現在のスレッドの実行を一定時間中断することができます。ObjectiveCにはこのようなものがありますか?

108
levi

はい、あります + [NSThread sleepForTimeInterval:]

(ちょうどあなたが将来の質問のために知っているように、Objective-Cは言語そのものです;オブジェクトのライブラリ(少なくともそれらの1つ)はCocoaです。)

156
smorgan

Javaで1秒のスリープ:

Thread.sleep(1000);

目的Cで1秒の間スリープします:

[NSThread sleepForTimeInterval:1.0f];
87
Rok Strniša

なんで寝てるの?スリープすると、UIがブロックされ、他のスレッドではないバックグラウンドURLの読み込みもブロックされます(NSURL非同期メソッドを使用すると、現在のスレッドで動作します)。

本当に欲しいのはperformSelector:withObject:AfterDelayです。これはNSObjectのメソッドで、後で所定の間隔でメソッドを呼び出すことができます-後で実行される呼び出しをスケジュールしますが、スレッドが処理する他のすべてのもの(UIやデータロードなど)はまだ続きます。

もちろん、標準のUnixのsleep()およびusleep()呼び出しも使用できます。 (Cocoaを作成する場合、[NSThread sleepForTimeInterval:]のままにします。)

7
Bill Heyman

NSThread sleepForTimeInterval(コメント付きコード)を使用してスリープすると、データのフェッチはブロックされますが、+ [NSThread sleepForTimeInterval:](checkLoadメソッド)はデータのフェッチをブロックしません。

以下の私のコード例:

- (void)viewDidAppear:(BOOL)animated
{
//....
//show loader view
[HUD showUIBlockingIndicatorWithText:@"Fetching JSON data"];
//    while (_loans == nil || _loans.count == 0)
//    {
//        [NSThread sleepForTimeInterval:1.0f];
//        [self reloadLoansFormApi];
//        NSLog(@"sleep ");
//    }
[self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
}

-(void) checkLoad
{
    [self reloadLoansFormApi];
    if (_loans == nil || _loans.count == 0)
    {
        [self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
    } else
    {
        NSLog(@"size %d", _loans.count);
        [self.tableView reloadData];
        //hide the loader view
        [HUD hideUIBlockingIndicator];
    }
}
5
wu liang

usleep()は、現在のスレッドを一時停止するためにこれを使用することもできます。

0
j2emanue