iOS Runloop 실습(상주 스레드)

3481 단어
정상적인 스레드 작업이 끝난 후, 스레드는finished 상태이며, 소각하고 다시 만들 수 있습니다.한 라인을 상주시키고 실시간 응답 스케줄링을 하려면runloop을 이용하여 임무를 효율적으로 분배할 수 있습니다.우선 하나의 라인을 만들면 코드가 매우 간단하다
- (void)viewDidLoad {
    [super viewDidLoad];

    //      
    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByNormal) object:nil] ;
//
//    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByCFObserver) object:nil] ;
//
//    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByCFTimer) object:nil] ;
//
//    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByCFSource) object:nil] ;


    [self.thread start];
}

/**
 *      runloop   。  :  
 */
- (void)createRunloopByNormal{
    @autoreleasepool {

        //  port ,  runloop    ,         。
        [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
        
        //  runloop
        [[NSRunLoop currentRunLoop] run];
    }
}

위의 창설 방식은 업무에서 자주 사용하는 방식이다. 유명한 AFNetworking은 바로 이런 방식으로 시작된 AFNetworking 라인이 상주하는 것이다.
다음은 라인이 종료되는지 테스트해 보겠습니다.
- (IBAction)btnClick:(id)sender {
    
    NSLog(@"-----btnClick--------");
    [self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];
    
}


- (void)test{
    NSLog(@"----->Test");
}


인쇄할 수 있는 --->Test는 스레드가 무효가 아니라는 것을 설명합니다.Core Foundation을 통해runloop을 만드는 방법
/**
 *     CFRunLoop    Observer   ,  runloop。  :  
 */
- (void)createRunloopByCFObserver{
    @autoreleasepool {
        CFRunLoopRef runloop = CFRunLoopGetCurrent();
        CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
            
            NSLog(@"CFRunLoopActivity -->%zd",activity);
            
        });
        
        CFRunLoopAddObserver(runloop, observer, kCFRunLoopDefaultMode);
        CFRelease(observer);
        
        CFRunLoopRun();
    }
}

/**
 *     CFRunLoop    Timer   ,  runloop。  :  
 */
- (void)createRunloopByCFTimer{
    @autoreleasepool {
        CFRunLoopRef runloop = CFRunLoopGetCurrent();
        CFRunLoopTimerRef timer = CFRunLoopTimerCreateWithHandler(CFAllocatorGetDefault(), CFAbsoluteTimeGetCurrent(), kCFAbsoluteTimeIntervalSince1904, 0, 0, ^(CFRunLoopTimerRef timer) {
            
        });
        CFRunLoopAddTimer(runloop, timer, kCFRunLoopDefaultMode);
        
        CFRelease(timer);
        
        CFRunLoopRun();
    }
}

/**
 *     CFRunLoop    Source   ,  runloop。  :  
 */
- (void)createRunloopByCFSource{
    @autoreleasepool {
        CFRunLoopRef runloop = CFRunLoopGetCurrent();
        CFRunLoopSourceContext source_context;
        bzero(&source_context, sizeof(source_context));
        CFRunLoopSourceRef source = CFRunLoopSourceCreate(CFAllocatorGetDefault(), 0,&source_context );
        
        CFRunLoopAddSource(runloop, source, kCFRunLoopDefaultMode);
        CFRelease(source);
        
        CFRunLoopRun();
    }
}

테스트를 통해 단순히 Observer를 추가한 다음에runloop을 시작하면runloop이 장기적으로 실행되지 않으면 퀴즈를 종료합니다.또 다른 Source, Timer는runloop의 정상적인 운행을 보장할 수 있다.
팁:
1.Source、Timer、Observer      
2. Observer    runloop        ,      
3. Timer       ,       time  。

좋은 웹페이지 즐겨찾기