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


112

Javaでは、を使用して、現在のスレッドの実行を一定時間一時停止できますThread.sleep()。Objective-Cにこのようなものはありますか?

回答:


160

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

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


6
Thnx!<br>将来の参照のために、定義は実際には+ [NSThread sleepForTimeInterval:]です(したがって、[NSThread sleepForTimeInterval:0.1]のように使用されます)。
TinkerTank 2010

これは完璧です。ありがとう!アニメーションブロックを完成させたところ、とても魅力的でした。
RileyE

メインtheradで寝てみませんか?
jerinho.com

1
それは同じだ; メインスレッドは単なるスレッドです。ただし、プログラムが応答しなくなるため、メインスレッドでスリープすることは通常はお勧めできません。
smorgan 2012

4
不思議に思う人にとって、[NSThread sleepForTimeInteval:]は[[NSThread currentThread] sleepForTimeInterval:]と同じです。
pnizzle 2014


40

なんで寝てるの?眠っているときは、UIと他のスレッドにないバックグラウンドURLの読み込みをブロックしています(NSURL非同期メソッドを使用すると、現在のスレッドで引き続き動作します)。

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


43
睡眠はテスト目的で私に役立ちます。アプリが適切に応答するように、ネットワークの遅延をシミュレートできます。現在、私はローカルWebサーバーに対してテストしているので、すべてが本質的に瞬時に行われます。
brantonb 2010

6
スリープは、ネットワーク遅延をテストするための間違った方法です。この質問の答えを見て、stackoverflow.com / questions / 1502060 /…、シミュレータでネットワークの可変速度をテストする方法を確認してください。メインスレッドをスリープするとすべてがブロックされるため、ネットワークの遅延をシミュレートするのではなく、アプリの一時停止をシミュレートします。
Kendall Helmstetter Gelner、2010

スリープは、JAVAスレッドの結合操作で実行される処理をシミュレートするのに役立ちます。10ミリ秒間スリープし、スレッドが停止しているかどうかを確認してから、割り当てを解除できます。
Mike S

1
一定期間スリープすると、スレッドはスリープする前とまったく同じ状態になります。現実の世界ではアプリケーションはスリープ状態ではなく処理されるため、これは良いテストではありません。そのため、睡眠に依存せずにテストする方法を理解することが重要です。
Kendall Helmstetter Gelner、2010

+1別の解決策を指摘してくれてありがとう!ちょうど私が探していたもの:)
jpswain '05年

7

もちろん、標準のUnixのsleep()およびusleep()呼び出しを使用することもできます。(ただし、Cocoaを記述している場合は、[NSThread sleepForTimeInterval:]のままにしておきます。)


5

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];
    }
}

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.