Objective-C / Cocoa에서 Java의 Thread.sleep ()에 해당하는 것은 무엇입니까?


112

Java에서는를 사용하여 일정 시간 동안 현재 스레드의 실행을 일시 중단 할 수 있습니다 Thread.sleep(). Objective-C에 이와 같은 것이 있습니까?

답변:


160

예, + [NSThread sleepForTimeInterval :]이 있습니다.

(향후 질문에 대해 알다시피 Objective-C는 언어 자체입니다. 객체 라이브러리 (적어도 그중 하나)는 Cocoa입니다.)


6
Thnx! <br> 향후 참조를 위해 정의는 실제로 + [NSThread sleepForTimeInterval :]입니다 (따라서 [NSThread sleepForTimeInterval : 0.1]처럼 사용됨).
TinkerTank 2010

이것은 완벽 해요. 감사! 방금 애니메이션 블록을 완성했는데 매력처럼 작동했습니다.
RileyE

메인 테라 드에서 자면 어때?
jerinho.com

1
그것은 동일합니다; 메인 스레드는 스레드입니다. 주 스레드에서 잠자는 것은 프로그램이 응답하지 않게하므로 일반적으로 나쁜 생각입니다.
smorgan

4
궁금한 사람들을 위해 [NSThread sleepForTimeInteval :]은 [[NSThread currentThread] sleepForTimeInterval :]과 동일합니다.
pnizzle 2014-08-31

94

자고 일초 자바 :

Thread.sleep(1000);

자고 일초 목표의 C :

[NSThread sleepForTimeInterval:1.0f];

40

왜 자고 있니? 절전 모드에서는 UI와 다른 스레드가 아닌 백그라운드 URL로드를 차단합니다 (NSURL 비동기 메서드 사용은 현재 스레드에서 계속 작동 함).

실제로 원하는 것은 performSelector : withObject : AfterDelay입니다. 이는 나중에 미리 결정된 간격으로 메서드를 호출하는 데 사용할 수있는 NSObject의 메서드입니다. 나중에 수행 될 호출을 예약하지만 스레드가 처리하는 다른 모든 항목 (예 : UI 및 데이터로드)은 여전히 계속됩니다.


43
수면은 테스트 목적으로 나에게 유용합니다. 내 앱이 제대로 응답하는지 확인하기 위해 일부 네트워크 지연을 시뮬레이션 할 수 있습니다. 현재 저는 로컬 웹 서버에 대해 테스트 중이므로 모든 것이 본질적으로 즉각적입니다.
brantonb 2010

6
절전은 네트워크 지연을 테스트하는 잘못된 방법입니다. 시뮬레이터에서 다양한 네트워크 속도를 테스트하는 방법을 보려면 이 질문에 대한 답을보십시오. stackoverflow.com/questions/1502060/… 주 스레드의 휴면은 모든 것을 차단하기 때문에 네트워크 지연을 전혀 시뮬레이션하는 것이 아니라 앱 일시 중단이 더 많습니다.
Kendall Helmstetter Gelner 2010 년

슬리핑은 JAVA 스레드의 조인 작업에서 수행되는 작업을 시뮬레이션하는 데 유용합니다. 10 밀리 초 동안 잠을 자고 스레드가 죽었는지 확인한 다음 할당을 취소 할 수 있습니다.
Mike S

1
일정 시간 동안 잠을 자면 스레드는 잠들기 전과 똑같은 상태가됩니다. 실제 세계에서는 응용 프로그램이 수면이 아닌 처리되므로 좋은 테스트가 아닙니다. 그렇기 때문에 수면에 의존하지 않고 테스트하는 방법을 알아내는 것이 중요합니다.
Kendall Helmstetter Gelner

+1 대체 솔루션을 알려 주셔서 감사합니다! 나는 :)을 찾고 있었어요 그냥 뭐
jpswain

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 ()은 또한 현재 스레드를 일시 중지하는 데 사용되는 ive로 사용할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.