Apa yang setara dengan Thread.sleep () Java di Objective-C / Cocoa?

112

Di Java, Anda dapat menangguhkan eksekusi thread saat ini selama beberapa waktu menggunakan Thread.sleep(). Apakah ada yang seperti ini di Objective-C?

levi
sumber

Jawaban:

160

Ya, ada + [NSThread sleepForTimeInterval:]

(Asal Anda tahu untuk pertanyaan mendatang, Objective-C adalah bahasa itu sendiri; perpustakaan objek (setidaknya salah satunya) adalah Cocoa.)

smorgan
sumber
6
Thnx! <br> untuk referensi di masa mendatang, definisi sebenarnya adalah + [NSThread sleepForTimeInterval:] (jadi, digunakan seperti [NSThread sleepForTimeInterval: 0.1]).
TinkerTank
Ini sempurna. Terima kasih! Saya baru saja menyelesaikan blok animasi saya dan itu bekerja seperti pesona.
RileyE
bagaimana kalau tidur di teras utama?
jerinho.com
1
Itu sama; utas utama hanyalah utas. Tidur di thread utama biasanya merupakan ide yang buruk, karena itu membuat program Anda tidak responsif.
smorgan
4
bagi mereka yang bertanya-tanya, [NSThread sleepForTimeInteval:] sama dengan [[NSThread currentThread] sleepForTimeInterval:].
pnizzle
94

Tidur selama satu detik di Jawa:

Thread.sleep(1000);

Tidur selama satu detik di Tujuan C:

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

Kenapa kamu tidur Saat tidur, Anda memblokir UI dan juga URL latar belakang yang tidak dimuat di thread lain (menggunakan metode asinkron NSURL masih beroperasi di thread saat ini).

Kemungkinan yang Anda inginkan adalah performSelector: withObject: AfterDelay. Itu adalah metode di NSObject yang dapat Anda gunakan untuk memanggil metode pada interval yang ditentukan sebelumnya nanti - ini menjadwalkan panggilan yang akan dilakukan di lain waktu, tetapi semua hal lain yang ditangani thread (seperti UI dan pemuatan data) akan masih berlanjut.

Kendall Helmstetter Gelner
sumber
43
Tidur berguna bagi saya untuk tujuan pengujian. Saya dapat mensimulasikan beberapa penundaan jaringan untuk memastikan bahwa aplikasi saya merespons dengan benar. Saat ini saya sedang menguji server web lokal, jadi semuanya pada dasarnya instan.
brantonb
6
Tidur adalah cara yang salah untuk menguji penundaan jaringan. Lihat jawaban untuk pertanyaan ini stackoverflow.com/questions/1502060/… untuk mengetahui cara menguji kecepatan variabel jaringan di simulator. Karena tidur thread utama memblokir semuanya, Anda tidak mensimulasikan penundaan jaringan sama sekali, tetapi lebih dari penangguhan aplikasi.
Kendall Helmstetter Gelner
Tidur berguna untuk mensimulasikan apa yang dilakukan pada operasi gabungan pada utas JAVA. Anda tidur selama 10 milis, periksa apakah utasnya mati maka Anda dapat membatalkannya.
Mike S
1
Jika Anda tidur untuk jangka waktu tertentu, utas Anda akan berada persis dalam keadaan yang sama seperti sebelum Anda tidur. Ini bukan tes yang bagus karena di dunia nyata aplikasi Anda akan diproses, bukan tidur. Itulah mengapa penting untuk mengetahui cara menguji tanpa bergantung pada tidur.
Kendall Helmstetter Gelner
+1 Terima kasih telah menunjukkan solusi alternatif! Hanya apa yang saya cari :)
jpswain
7

Tentu saja, Anda juga dapat menggunakan panggilan Unix sleep () dan usleep () standar. (Jika menulis Cocoa, saya akan tetap menggunakan [NSThread sleepForTimeInterval:], bagaimanapun.)

Bill Heyman
sumber
5

Jika Anda menggunakan NSThread sleepForTimeInterval (kode komentar) untuk tidur, pengambilan data akan diblokir, tetapi + [NSThread sleepForTimeInterval:] (metode checkLoad) tidak akan memblokir pengambilan data.

Kode contoh saya seperti di bawah ini:

- (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];
    }
}
wu liang
sumber
0

usleep () juga dapat digunakan karena ive digunakan ini untuk menjeda utas saat ini

j2emanue
sumber