iOS 코드를 마스터 스레드로 동기화하는 3가지 방법

2928 단어
 APP   ,                   ,       ,                 UI,    。                 :
  • NSThread 방식
  • iOS 문서를 질의하려면 다음과 같이 하십시오.
    @interface NSObject (NSThreadPerformAdditions)
    
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray *)array;
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
        // equivalent to the first method with kCFRunLoopCommonModes
    

    적용:
    - (void)updateUIWith:(UIColor *)color{
        
        [self.bottomView setBackgroundColor:color];
    }
    [self performSelectorOnMainThread:@selector(updateUIWith:) withObject:[UIColor purpleColor] waitUntilDone:YES  modes:[NSArray arrayWithObject:(__bridge NSString*)kCFRunLoopCommonModes]];
    

    매개변수 설명:
  • (SEL) aSelector 주 스레드 호출을 새로 고치는 방법
  • withObject: (nullable id)arg에서 전달해야 하는 매개 변수
  • modes: (nullable NSArray *)array가 입력해야 하는 그룹 대상 유형은 NSString 매개 변수 유형입니다. 문서에서 알 수 있듯이 모델이 실제 필요로 하는 매개 변수의 정의는 다음과 같습니다.
  • CF_EXPORT const CFStringRef kCFRunLoopDefaultMode;
    CF_EXPORT const CFStringRef kCFRunLoopCommonModes;
    

    따라서 사용 시 교접 방법으로 전환해야 한다.modes 매개 변수는 선택할 수 있습니다. 이 매개 변수를 사용하지 않으면 문서에 있는 아래의 방법을 직접 사용할 수 있고 문서에서 설명을 드렸습니다. 이때 modes는 kCFRunLoopCommonModes의 방식입니다.
  • NSOperationQueue 방식 NSOperationQueue는 iOS에 봉인된 다중 스레드 클래스로 클래스 방법으로 메인 스레드를 직접 호출할 수 있다
  • + (NSOperationQueue *)mainQueue NS_AVAILABLE(10_6, 4_0);
    

    호출할 방법을 메인 라인에 직접 추가하면 됩니다. NSOperationQueue로 봉인된 대상 방법
    - (void)addOperationWithBlock:(void (^)(void))block NS_AVAILABLE(10_6, 4_0);
    

    응용 프로그램
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                
                [self.bottomView setBackgroundColor:[UIColor redColor]];
    
            }];
    
  • GCD 방식은 먼저 주 스레드를 가져와야 한다. 문서는 다음과 같다:
  • /*!
     * @function dispatch_get_main_queue
     *
     * @abstract
     * Returns the default queue that is bound to the main thread.
     *
     * @discussion
     * In order to invoke blocks submitted to the main queue, the application must
     * call dispatch_main(), NSApplicationMain(), or use a CFRunLoop on the main
     * thread.
     *
     * @result
     * Returns the main queue. This queue is created automatically on behalf of
     * the main thread before main() is called.
     */
    DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_CONST DISPATCH_NOTHROW
    dispatch_queue_t
    dispatch_get_main_queue(void)
    {
        return DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q);
    }
    

    호출된 방법을 메인 라인에 연결하고 여기에 Block 방법을 사용합니다. 물론 시스템 봉인 방법입니다. 실현 코드는 다음과 같습니다.
    dispatch_async(dispatch_get_main_queue(), ^{
               
                [self updateUIWith:[UIColor greenColor]];
                
            });
    

    결어
            ,        。
    

    좋은 웹페이지 즐겨찾기