2012-09-06 3 views
1

서버 스타일 프로그램 인 첫 번째 OS X 커맨드 라인 프로그램을 작성했습니다. 다양한 정보를 처리하고 다른 이벤트에 응답하는 것이 업무입니다.OS X main.m 서버 스타일 프로그램 실행

내 main.m

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 

     PIPieman *pieman = [[[PIPieman alloc] init] autorelease]; 
     [pieman start]; 

     NSRunLoop *loop = [NSRunLoop currentRunLoop]; 
     while (!pieman.finished && [loop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

    } 
    return 0; 
} 

에 다음 코드를 나는 여러 문서에서이 코드를 가지고와 기본 개념은 pieman.finished가 YES로 설정되면, 프로그램은 다음 종료한다는 점이다.

문제는 pieman 내부의 코드에서 플래그를 설정했지만 실행 루프가 트리거되지 않아 프로그램이 종료되지 않습니다. 나는 실행 루프를 트리거하는 방법을 찾고 있었고 다양성이있는 것처럼 보였지만 좋은 해결책 인 것 같은 느낌은 없었습니다. 예를 들어 실행 루프의 주기적 트리거링을 발생 시키려면 beforeDate:을 몇 초로 줄일 수 있습니다.

내 우선 순위는 finished 부울 값 변경시 실행 루프를 트리거하는 것입니다.

제안 사항?

답변

3

runMode:beforeDate:에서 돌아가려면 실행 루프에 알려야합니다. NSRunLoop 클래스는 메시지를 정의하지 않지만 NSRunLoopCFRunLoop에 빌드되며 CFRunLoopStop 함수는 필요한 것을 수행합니다.

@implementation PIPieman 

... 

- (void)setFinished:(BOOL)finished { 
    _finished = finished; 
    CFRunLoopStop(CFRunLoopGetMain()); 
} 
+0

감사합니다. – drekka