2013-05-10 4 views
5

나는 this, this, this과 같은 NSRunLoop에 관한 많은 게시물을 읽었습니다. 그러나 NSRunLoop 실제로 내가 주로 참조하는 것이NSRunLoop의 기능은 무엇입니까?

- (void)threadProc 
{ 
    NSAutoreleasePool* pool1 = [[NSAutoreleasePool alloc] init]; 
    BOOL isStopped = NO; 
    NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 
    [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; 

    while (!isStopped) 
    { 
     { 
      NSAutoreleasePool* pool2 = [[NSAutoreleasePool alloc] init]; 
      [runloop runMode:NSDefaultRunLoopMode 
             beforeDate:[NSDate distantFuture]]; 

      [pool2 release]; 
     } 
    } 

    [pool1 release]; 
} 

그리고 메인 스레드 내부 NSRunLoop와 작업자 스레드

wthread = [[NSThread alloc] initWithTarget:self selector:@selector(threadProc) object:nil]; 
[wthread start]; 

입니다

수행이에 몇 가지 작업을 통과 알아낼 수 없습니다 wthread

[self performSelector:@selector(someWork:) onThread:wthread withObject:nil waitUntilDone:NO]; 

주 스레드에서 wor 스레드 ker 스레드, 많은 사람들이 이것을 참조하십시오. NSRunLoop이 필요한 이유는 무엇입니까? 그것은 무엇을합니까?

이벤트를 관리하는 데 NSRunLoop이 사용되었습니다. runModethreadProc을 호출하는 것 외에는 다른 이유가 있습니까?

+0

나는 멋진 동안 (사실이) {//이 작업이 여기에 수행 할 수 삽입 (Insert)}로 생각 (이벤트, 작업, 소켓 등) 실행할 코드를 동적으로 추가 할 수 있습니다. runloop은 실제로 비어 있지 않으며, 포트는 runloop에 연결되어 있으며 프로세스 간 통신의 한 형태입니다. – foFox

+0

이 http://bou.io/RunRunLoopRun.html이 유용하다는 것을 알았습니다. – onmyway133

답변

3

표시된 예는 -threadProc 종료 후에도 계속 실행될 스레드를 만드는 코코아 관용구입니다. 왜?

때문에 : 당신이 만든 NSRunLoop 인스턴스가 당신이 명시 적으로 추가하지 않고 runMode:beforeDate

런 루프를 적어도 하나의 입력 소스 ([NSMachPort port])

  • 시작했습니다있다
    • 입력 소스와 명시 적으로 실행 루프를 시작하면 스레드가 종료됩니다.

      실행 루프가 이벤트 및 특정 비동기 작업을 관리하는 데 여전히 중요하지만, 요즘은 코코아 응용 프로그램에서 대부분의 비동기 작업을 설계하는 기본 방법으로 NSThread을 볼 수 없습니다. GCD는 배경 작업을 캡슐화하는 훨씬 깨끗한 방법입니다.

      편집 : GCD에 직렬 큐에 작품을 제출

      가 :

      @interface Foo : NSObject 
      @end 
      
      @implementation Foo { 
          dispatch_queue_t _someWorkerQueue; 
      } 
      
      - (id)init { 
          self = [super init]; 
          if(!self) return nil; 
      
          _someWorkerQueue = dispatch_queue_create("com.company.MyWorkerQueue", 0); 
          return self; 
      } 
      
      - (void)performJob { 
          dispatch_async(_someWorkerQueue, ^{ 
           //do some work asynchronously here 
          }); 
      
          dispatch_async(_someWorkerQueue, ^{ 
           //more asynchronous work here 
          }); 
      } 
      @end 
      
  • +0

    1) 왜 threadProc 내부에서 루프가 발생합니까? 2) GCD는 사용 가능한/알 수없는 스레드로 작업을 전송하지만 NSRunLoop은 모든 작업이이 동일한 작업자 스레드로 전송되도록합니다. 맞습니까? – onmyway133

    +0

    실행 루프를 종료하는 메커니즘을 제공하려면 - 플래그 isStopped가 설정된 경우 (코드에는 표시되지 않지만 ...) – FluffulousChimp

    +0

    2) 설명하는 유스 케이스에 대한 GCD 접근 방식에 대한 편집 된 답변을 참조하십시오. – FluffulousChimp

    3

    많은 장면이 뒤 따른다. 그 이유는 작업 항목이 없을 때 스레드가 실행을 중지하는 방법을 제공하기 때문입니다. 실시간 OS를 사용한 적이 있다면, 태스크는 다른 사람들이 실행할 수 있도록 프로세서를 포기할 장소가 필요합니다.

    잘 설명되어 있지 않은 것은 performSelector : onThread : ...를 보낼 때 메시지를 대기열에 두는 실행 루프이고 스레드가 처리하도록 실행합니다. while 루프에 로그 메시지를 추가하면이를 알 수 있습니다.

    정말 궁금한 점이 있으시면 github에 샘플 코드가 있습니다. 실행 루프로 놀아 보시고 코멘트를 추가하시면 몇 가지 목록을 드리겠습니다.

    +0

    1)하지만 threadProc 내부에는 while 루프가있어서 스레드가 항상 바쁠 수 있습니까? NSRunLoop이 어떻게 실행을 멈추라 고 말할 수 있습니까? 2) AFAIK, performSelector : onThread :에 대한 많은 호출이 동일한 작업자 스레드로 작업을 전달하도록 보장하는 메커니즘입니다. – onmyway133

    +0

    1) 명확하지 않으셔서 죄송합니다 - 운영 체제는 runMode 내부 스레드를 일시 중단합니다. 처리 할 코드가없는 경우입니다. 2) 시스템의 기능 중 하나입니다. 그러나 포트와 타이머 처리가 있습니다. CFRunloop의 사과 문서를 읽으면 가장 많은 것을 배울 수 있습니다. –