Java'nın Thread.sleep () işlevinin Objective-C / Cocoa'daki karşılığı nedir?


112

Java'da mevcut iş parçacığının çalışmasını kullanarak belirli bir süre askıya alabilirsiniz Thread.sleep(). Objective-C'de buna benzer bir şey var mı?

Yanıtlar:


160

Evet, + [NSThread sleepForTimeInterval:] var

(Gelecekteki sorular için bildiğiniz gibi, Objective-C dilin kendisidir; nesnelerin kütüphanesi (en azından bunlardan biri) Cocoa'dır.)


6
Thnx! <br> ileride başvurmak için, tanım aslında + [NSThread sleepForTimeInterval:] şeklindedir (bu nedenle [NSThread sleepForTimeInterval: 0.1] gibi kullanılır).
TinkerTank

Bu harika. Teşekkürler! Animasyon bloklarımı yeni bitirdim ve harika çalıştı.
RileyE

main therad'da uyumaya ne dersin?
jerinho.com

1
Aynısı; ana konu sadece bir iş parçacığıdır. Ana iş parçacığı üzerinde uyumak genellikle kötü bir fikirdir, çünkü programınızı yanıt vermez hale getirir.
smorgan

4
merak edenler için, [NSThread sleepForTimeInteval:], [[NSThread currentThread] sleepForTimeInterval:] ile aynıdır.
pnizzle

94

Java'da bir saniye uyumak :

Thread.sleep(1000);

Hedef C'de bir saniye uyumak :

[NSThread sleepForTimeInterval:1.0f];

40

Neden uyuyorsun? Uyuduğunuzda, kullanıcı arayüzünü ve diğer iş parçacıklarında olmayan arka plan URL'lerini engelliyorsunuz (NSURL zaman uyumsuz yöntemlerini kullanarak, geçerli iş parçacığı üzerinde hala çalışıyor).

Muhtemelen gerçekten istediğiniz şey performSelector: withObject: AfterDelay. Bu, NSObject'te daha sonra önceden belirlenmiş bir aralıkta bir yöntemi çağırmak için kullanabileceğiniz bir yöntemdir - daha sonra gerçekleştirilecek bir çağrıyı planlar, ancak iş parçacığının işlediği diğer tüm şeyler (UI ve veri yüklemeleri gibi) hala devam ediyor.


43
Uyumak, test amacıyla benim için yararlıdır. Uygulamamın doğru yanıt verdiğinden emin olmak için bazı ağ gecikmelerini simüle edebilirim. Şu anda yerel bir web sunucusuna karşı test yapıyorum, bu nedenle her şey aslında anlık.
brantonb

6
Uyku, ağ gecikmelerini test etmenin yanlış yoludur. Simülatörde ağların değişken hızlarını nasıl test edeceğinizi görmek için stackoverflow.com/questions/1502060/… bu sorunun cevabına bakın. Ana iş parçacığı uyku her şeyi engellediğinden, bir ağ gecikmesini simüle etmiyorsunuz, daha çok uygulamanın askıya alınmasına benziyorsunuz.
Kendall Helmstetter Gelner

Uyku, bir JAVA iş parçacığı üzerindeki bir birleştirme işleminde yapılanları simüle etmek için kullanışlıdır. 10 milisaniye uyursunuz, ipliğin ölü olup olmadığını kontrol edin, sonra onu kaldırabilirsiniz.
Mike S

1
Herhangi bir süre uyursanız, ipliğiniz uyumadan önceki haliyle tam olarak aynı durumda olacaktır. Bu iyi bir test değil çünkü gerçek dünyada başvurunuz işleniyor, uykuda değil. Bu yüzden uykuya güvenmeden nasıl test yapılacağını bulmak önemlidir.
Kendall Helmstetter Gelner

+1 Alternatif bir çözüme işaret ettiğiniz için teşekkürler! Tam aradığım şey :)
jpswain

7

Elbette standart Unix sleep () ve usleep () çağrılarını da kullanabilirsiniz. (Kakao yazarsam, ancak [NSThread sleepForTimeInterval:] ile kalırdım.)


5

Uyku için NSThread sleepForTimeInterval (açıklamalı kod) kullanırsanız, veri getirme engellenir, ancak + [NSThread sleepForTimeInterval:] (checkLoad yöntemi) veri getirmeyi engellemez.

Örnek kodum aşağıdaki gibidir:

- (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 (), bunu mevcut iş parçacığını zaman zaman duraklatmak için kullandığından da kullanılabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.