본문 바로가기

프로그래밍/iOS

비동기 처리방법 및 장/단점(GCD 제외)

  1. 비동기 처리
    - 소요시간이 오래 걸리는 작업을 백그라운드에서 처리하여 메인 스레드에 반영.
    - 동시에 여러 작업을 하거나 지속적인 모니터링이 필요한 작업에 사용.
       1) 웹 상의 이미지 다운로드
       2) 데이터 파싱
       3) 채팅관련 푸시 모니터링 등


  2. 비동기 처리 방법
    - 비동기 디자인 패턴 : delegate, @selector, block, Notification
    - NSThread
       1) NSOperation보다 우선순위 관리가 좋음
       2) 사용 방법
          1] 상속: main() 메소드를 overriding, 인스턴스 생성 후 start() 메소드 실행.
          2] 클래스메소드: 실행 할 작업을 메소드에 구현, 인스턴스 생성 후 start() 메소드 실행.
          3] detachNewThreadSelector - 클래스메소드와 다르게 호출과 동시에 실행 - NSInvocationOperation과 유사.       4] detachNewThreadBlock - 백그라운드에서 실행되는 작업을 블록으로 구현          - NSBlockOperation과 유사.    3) 포함된 메소드: exit(종료)      cancel(중지)      sleep-(잠시 중지)
       4) 상태: executing(작업 중) finished(종료) cancelled(취소)

    - NSOperation
       1) 우선순위, 의존성 등을 지원하는 Thread safe한 객체(네트워크, 이미지 처리 등의 어떤 작업)    2) 사용 방법
          1] 상속: main() 메소드 overriding, 인스턴스 생성 후  start() 메소드 실행.
          2] NSBlockOperation(detachNewThreadBlock와 유사)       3] NSInvocationOperation(detachNewThreadSelector와 유사)       4] NSOperationQueue에 추가    3) NSOperationQueue: 우선순위와 최대 실행 작업 수에 따라 작업 관리.    4) asynchronous 프로퍼티로 동기/비동기 결정   5) 속성: ready(초기화 완료) executing(작업 중) finished(종료, Dequeue)                 cancelled(취소, executing: NO, finished: YES)

    - (performSelector-)
       1) 1회만 호출 하는 경우 사용하기 편리함
       2) waitUntilDone을 통해 동기/비동기 처리 가능   3) 동기 / 비동기 처리 예

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // 동기처리
        NSLog(@"------------- before Method -------------");
        [self outputLog];
        [self performSelector:@selector(outputLog) withObject:nil];
        [self performSelectorOnMainThread:@selector(outputLog) withObject:nil waitUntilDone:YES];
        NSLog(@"------------- after Method -------------");
        // 동기처리 결과
        // ------------- before Method -------------
        // ------------- In Method -------------
        // ------------- after Method -------------
        
        
        // 비동기 처리
        NSLog(@"------------- before Method -------------");
        [self performSelectorOnMainThread:@selector(outputLog) withObject:nil waitUntilDone:NO];
        [self performSelectorInBackground:@selector(outputLog) withObject:nil];
        NSLog(@"------------- after Method -------------");
        // 비동기처리 결과
        // ------------- before Method -------------
        // ------------- after Method -------------
        // ------------- In Method -------------
    }
    
    - (void)outputLog {
        NSLog(@"------------- In Method -------------");
    }
    


    - Timer
       1) 아주 간단한 작업에만 사용하기 적절

    - CGD(추가 업로드 예정)


  3. 교착상태를 막는 방법
    - 변수: atomic 사용(property 변수 default형은 atomic)
    - 메소드: @synchronized 사용.


  4. 비동기 처리 장점 및 단점
    - 장점: 동시에 여러 작업을 처리하는 것이 가능하여 자원을 효율적으로 활용 가능
    - 단점: 동기 처리보다 설계가 복잡하고, dead lock(교착상태)이 발생할 수 있음


'프로그래밍 > iOS' 카테고리의 다른 글

GCD(Grand Central Dispatch) 사용  (0) 2017.04.21
KVC(Key-Value Coding) & KVO(Key-Value Observing)  (0) 2017.04.18
setNeedsLayout VS layoutIfNeeded / setNeedsDisplay VS layoutIfDisplay  (1) 2017.04.14
Run Loop  (0) 2017.04.12
NSHashTable  (0) 2017.04.11