Tuesday, April 25, 2017

iOS 백그라운드 비동기 작업 방법 (3 가지)

1. PerformSelectorInXXX
self performSelectorInBackground:@selector(myMethod:) withObject:
self performSelectorInMainThread:@selector(updateUI:) withObject:

-(void)updateUI:(NSDictionary *)param{
}

2. NSOperationQueue
_queue = [[NSOperationQueue alloc] init];

//시간이 오래 걸리는 작업을 만들어 백그라운드 큐에 돌려줍시다.
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        [self heavyOperation];
        //오래 걸리는 작업의 결과로 UI업데이트를 진행시켜줍니다.
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [self updateUI:nil];
        }];
    }];
    [_queue addOperation:operation];

3. GCD
// 여기서부터 비동기 코드 시작.
    // dispatch_async 함수는 내부블럭의 코드 실행에 영향을 받지 않고 바로 실행이 끝난다.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
        // 작업이 오래 걸리는 API를 백그라운드 스레드에서 실행한다.
        BOOL res = [self heavyOperation];
        dispatch_async(dispatch_get_main_queue(), ^{
            // 이 블럭은 메인스레드(UI)에서 실행된다.
            if (res) {
                [self updateUI:nil];
            }else {
                [self alertFail];
            }
        });
    });

dispatch_one : 한번만
dispatch_after : 일정 시간 후에

No comments:

Post a Comment