2011-12-22 3 views
2

앱이 반응 형이지만 활동이 모두 중첩 된 방식으로 함께 연결되지 않고 스레드를 사용하지 않고 일련의 활동을 구현하는 데 권장되는 방법이 있습니까?이벤트가 자체 생성되는 이벤트 기반 상태 시스템을 어떻게 구현합니까?

시도해 보겠습니다. - 다운로더 클래스를 사용하여 zip 파일을 다운로드하는 모델 클래스가 있고, 다운로드 한 모델이 파일을 압축 해제 한 다음 압축 해제 된 파일을 사용하여 무언가를 수행한다고 가정 해 보겠습니다. 다운로더 클래스에서

: 모델 클래스에서

- (void) connectionDidFinishLoading:(NSURLConnection *)connection { 
    // ... 
    [self.delegate zipFileDownloadingCompleted]; 
} 

:

다운로더 클래스는 모델 클래스를 알려주는 경우

지금 다운로드는이 ​​같은 대리인을 통해 준비

- (void) zipFileDownloadingCompleted { 
    [self unzipFile]; 
    [self doSomethingElseWithFile]; 
    [self doSomeOtherStuff]; 
} 

하지만 unZipFile 및 doSomethingElseWithFile 및 doSomeOther 물건은 비동기 API를 사용하는 긴 액티비티 일 수 있습니다. 모델 클래스는 이들을 분리하여 unzipFile의 델리게이트가 호출 된 후에 만 ​​doSomethingElseWithFile을 호출하고 doSomethingElseWithFile에서 델리게이트가 호출 된 후에 만 ​​doSomeOtherStuff를 호출합니다. 하지만 이것은 유효한 접근법입니다. 모든 것이 함께 연결되어 있고 여전히 동기식 인 것처럼 보입니다.

어떻게 unZipFile과 doSomethingElseWithFile 및 doSomeOtherStuff를 별도의 활동 단위로 나눌 수 있습니까? 앱이 하나의 활동이 끝나면 실행 루프에서 뛰어 내린 다음 다시 돌아와 다음 활동을 수행 할 수 있습니까?

BREW에 익숙하다면 HandleEvent() 호출을 통해 실행하는 동안 하나의 활동을 수행 한 다음 HandleEvent()가 다음 이벤트를 처리하기 위해 다시 호출되도록 이벤트를 자체적으로 schudule합니다. 활동 등 - 그래서 응용 프로그램은 항상 반응이 남아 있습니다.

가능하면 스레드를 피하고 싶습니다. 이벤트 기반 코딩이 스레드보다 덜 복잡하고 오류가 발생하기 쉽지 않다고 생각합니다.

내가 그걸 잘 설명했다면 잘 모르겠다. 네가 요지를 얻었 으면 좋겠다.

답변

1

한 가지 방법은 performSelectorInBackground:withObject을 사용하여 장기 실행 작업을 비동기 적으로 실행하는 것입니다. 당신은 대체 할 수있는 대리인의 zipFileDownloadCompleted 다음과 같이

각 장기 실행 하위 작업에 그리고
- (void) zipFileDownloadCompleted { 
    [self performSelectorInBackground:@selector(processAsync) withObject:nil]; 
} 

- (void) processAsync { 
    if (!interrupt) { 
    [self unzipFile]; 
    [self doSomethingElseWithFile]; 
    [self doSomeOtherStuff]; 
    } 
} 

:

- (void) unzipFile { 
    if (!interrupt) { 
    ... 
    } 
} 

난 당신이 스레드를 피하려고 알고 있지만, 이것은 그들이 얻을만큼이나 간단합니다 .

이러한 세 가지 방법으로 콜백을 지정하여 오류 상태를 경고 할 수 있습니다. 당신은 꼼꼼히 실패하는 각 단계를 시작하기 전에 수표와 함께 processAsync을 강화할 것입니다. 수정 된 예제의 interrupt 자료를 참조하십시오 (물론 전세계의 것보다 견고하고 관리하기 쉽고 안전한 것을 사용하십시오).

+0

performSelectorInBackground에 의해 실행 된 기능이 완료되면 실행을 끝내기 전에 해당 기능을 중단시킬 필요가있을 때 시작된 기능을 취소 할 수 있습니까? – Gruntcakes

+0

@BiscutWoofington 그렇게 설정하면 yes입니다. 답변의 마지막 단락에 힌트가 있지만, 기본적으로'processAsync'와 세 가지 장기 실행 메소드에서 상태 검사와 콜백을 설정하면 언제든지 취소 할 수 있습니다. 내가 의미하는 바를 알 수 있도록 대답을 편집했습니다. –

0

-[NSRunLoop performSelector:target:argument:order:modes:] (apple docs)을 찾고있을 수 있습니다. 나는 이보다 더 많은 것을 위해이 Q&A을 조사 할 것이다, 특히 Brad Larson, 그는 그의 재료를 알고있다.

관련 문제