2014-12-26 1 views
2

NSOperation 하위 클래스를 사용하여 iOS에서 AsyncTask (Android)를 구현했습니다.iOS에서 NSOperation을 사용하는 AsyncTask 구현

-(id)initWithParam:(NSArray *)params{ 

if (self = [super init]) { 

paramsArray = params; 
} 
return self; 

} 

- (void)start { 

     @autoreleasepool { 

    if (self.isCancelled) 
     return; 
    NSInteger result; 

    result = [self doInBackground:paramsArray]; 

dispatch_async(dispatch_get_main_queue(), ^{ 

    [self postExecute:result]; 
}); 
} 
} 


- (BOOL) doInBackground: (NSArray *) parameters{ 

    BOOL status = false; 
    int i; 
for (i=0; i<100000; i++) { 
    NSLog(@"printing i::%d",i); 
} 
if (i == 100000) { 
    status = YES; 
} 

return status; 
} 
- (void) postExecute: (BOOL) deviceState{ 

    if (deviceState) { 
     NSLog(@"Finished"); 
    } 

} 

-(BOOL)isConcurrent{ 

    return YES; 
} 

이것은 iOS에서 구현 한 방식입니다.이 기능을 추가하고 싶은 점이 있으면 알려주세요. 나는 당신의 질문에 대한 대답에서 NSOperation 하위 클래스

답변

2

에 isExecuting 및 isFinished를 호출 할 때

는 또한, 불행하게도, 아니,이 구현이 올바르지 않습니다. 닫기,하지만 꽤 아닙니다.

몇 가지 :

  1. 귀하의 예를 동시 작동하지 않습니다. NSOperation의 경우 "동시 작업"(현재 "비동기 작업"이라고 함)이라는 용어는 특별한 의미가 있습니다. 비동기 작업은 start 메서드가 완료된 후에도 비동기 적으로 계속 실행되는 작업입니다. 그리고 을 isConcurrent (구형 iOS 버전) 및 isAsynchronous (현대 iOS 버전)에서 반환하여 지정합니다. 그러나 질문의 ​​예제 작업은 start이 끝나면 완전히 완료되므로 비동기 작업이 아니므로 isConcurrentisAsynchronousNO을 반환해야합니다.

    이 예에서는 isConcurrent을 에 수행 한 내용과 마찬가지로 NO으로 변경했다고 가정 해 보겠습니다. 그러면이 작업이 수정 될 것입니다. 그러나 이것이 당신을 혼란스럽게하지 마라. 이 작업을 자신의 작업 대기열에 추가 한 경우 주 대기열과 관련하여 비동기/동시 실행됩니다. start이 끝나면 자동으로 완료되는 작업이므로 isAsynchronous/isConcurrentNO을 반환해야합니다.

  2. "언제 isExecutingisFinished으로 전화 할 수 있습니까?" 자, 일반적으로 으로 전화하지 마십시오. 일반적으로 메소드를 구현합니다. 특히 비동기 작업이 끝나면 앱 (a)에서 isExecutingisFinished 키의 KVN을 게시해야합니다. (b) isExecutingisFinished을 오버라이드하여 적절한 값을 반환하는지 확인하십시오.

    진정한 비동기/동시 작업 일 경우에만 isExecutingisFinished 코드를 구현하면됩니다. 동시 실행을위한 작업 구성 섹션 (Concurrency Programming Guide: Operation Queues)을 참조하십시오. NSOperation class definition의 소개 섹션도 참조하십시오.

당신의 작업이 비동기 여부를해야하는지 여부 (또는 전혀 NSOperation를 서브 클래 싱 할 필요도없이) 불분명하다. 그것은 수행하려는 작업과 작업 자체가 비동기 적으로 실행되는지 여부에 전적으로 달려 있습니다.

+0

감사합니다. @Rob. 실제로 샘플을 거기에 넣었습니다. 실제로 내 작업은 사용자 정의 Wi-Fi 장치에 연결하고 장치에서 데이터를 읽는 중입니다. NSOperation 하위 클래스를 선택하는 이유는 무엇입니까 – iOS

+0

그래, NSOperation 하위 클래스로 래핑 할 수있는 좋은 예가 될 수 있습니다.질문은 단순히 작업이 실제로 동시인지 (즉, '시작'은 연결을 시작하고 나중에 호출되는 일부 대리자 또는 완료 블록 패턴이 있는지) 아닌지 여부입니다 (예 : '시작'은 Wi-Fi 장치와의 연결을 열지 만 장치와의 연결이 완료 될 때까지 돌아옵니다). 나는 그것이 전 (前者)이라고 가정하지만, 여러분의 질문에있는 당신의 모범은 후자와 더 비슷합니다. – Rob

관련 문제