탐색 모음에서 보기를 전환하는 동안 EXC_BAD_ACCESS 오류 없이 NSOperationQueue 스레드를 안전하게 종료하는 방법

StackOverflow https://stackoverflow.com/questions/2003445

  •  18-09-2019
  •  | 
  •  

문제

UITableView를 사용하여 일부 문자열 메시지를 표시하고 NSOperationQueue를 사용하여 백그라운드 스레드에서 메시지를 가져오는 사용자 정의된 NSOperation을 보유합니다.하나의 메시지를 성공적으로 가져온 후 사용자 정의된 NSOperation은 이를 표시하도록 UITableView 컨트롤러에 알립니다.

모든 메시지가 로드된 후 탐색 모음에서 뒤로 버튼을 클릭하여 UITableView에서 다른 보기로 전환하면 모든 것이 정상입니다.하지만 일부 메시지가 로드되는 동안 뒤로 버튼을 클릭하면 EXC_BAD_ACCESS가 발생합니다.사용자 정의된 NSOperation이 UITableView 컨트롤러에 다음을 알리는 동안 예외가 발생했음을 확인했습니다. performSelectorOnMainThread 방법.뷰 전환 후 대상 UITableView 컨트롤러가 유효하지 않은 것처럼 들리지만 Navigation Controller가 뷰 컨트롤러 인스턴스를 보유할 것이라고 생각합니다.이 문제를 해결하는 방법을 알 수 있습니까?감사해요.

사용자 정의 작업은 다음 코드를 사용하여 UITableView 컨트롤러에서 초기화됩니다.

StatusMessageLoadingOperation *operation = [[StatusMessageLoadingOperation alloc] 
                                            initWithData:person
                                            messageArray:cachedStatusMessages
                                            target:self 
                                            action:@selector(didFinishStatusMessages:)];
[operationQueue addOperation:operation];
[operation release];

사용자 정의된 NSOperation 클래스는 다음 코드로 UITableView를 업데이트합니다.

- (void)main{
    for (int i = 0; i < [[person statusMessages] count]; i++) {
        [target performSelectorOnMainThread:action withObject:messageArray waitUntilDone:NO];
    }
}
도움이 되었습니까?

해결책

당신은 전화를 시도 했습니까? [operationQueue cancelAllOperations] 당신의 viewWillDisappear 방법?

다른 팁

뷰 컨트롤러를 터뜨리면 해당 컨트롤러의 -dealloc 방법을 사용하면 대기열을 너무 일찍 해제할 수 있으며 애플리케이션의 일부 다른 부분이 더 이상 존재하지 않는 대기열 또는 내부 작업에 액세스하려고 시도하고 있을 수 있습니다.

내 추천은 당신의 NSOperationQueue *myQueue 인스턴스를 응용 프로그램 대리자에 추가하십시오.

앱 대리인의 사용 -applicationDidFinishLaunching: 그리고 -dealloc 대기열과 해당 콘텐츠를 초기화하고 해제하는 메서드입니다.

뷰 컨트롤러에서 큐를 분리하면 탐색 스택에서 뷰 컨트롤러를 꺼낼 때 큐가 해제되지 않습니다.이 작업과 나머지 작업은 나머지 애플리케이션에서 계속 사용할 수 있어야 합니다.

대기열에 더 쉽게 액세스하려면 다음 매크로 정의를 설정하세요.

#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)

그런 다음 매크로를 사용하여 다음과 같이 대기열에 액세스할 수 있습니다.

NSLog(@"%@", [[UIAppDelegate myQueue] operations]);

또는 예를 들면 다음과 같습니다.

[[UIAppDelegate myQueue] addOperation:myOperation];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top