0

최근 UITableViewControllertableView:cellForRowAtIndexPath의 충돌을 가지고멀티 스레드 TableViewController

Message* res = [messages objectAtIndex:indexPath.row] 

NSMutableArray 메시지입니다.

tableView:cellForRowAtIndexPath: 메서드에서 메시지 배열에서 메시지를 가져 오려고 시도했으나 해당 배열이 다른 스레드에 의해 변경되었을 수 있기 때문에 충돌이 발생합니다. 내 메시지 배열의 새로 고침은 다른 스레드에서 수행됩니다. 이것이 내가 이런 일이 일어 났을 것이라고 생각하는 이유입니다.

여러 스레드를 계속 사용해야하는 상황에서이 상황을 처리하는 가장 좋은 방법은 무엇입니까? 셀의 그림을 취소하고 전체 메시지 목록을 강제로 다시 그리는 방법이 있습니까? 나는 간단한 체크를하려고 노력했다.

어설 션 예외가 발생하고 앱이 다운되는 결과가 발생한다.

목표는 이러한 상황이 발생했을 때 전체보기를 정상적으로 다시로드하는 것입니다.

답변

0

멀티 스레딩을 처리 할 때는 백그라운드 스레드와 주 스레드 사이를 전환 할 때와 UI 업데이트시에주의해야합니다. 스레드가 완료되기 전에 UI를 업데이트하려고하면 충돌이 발생합니다. 첫째로 우리는 백그라운드 스레드의 작업은 내가 전화를 완료 한 직후 다른 방법

-(void)fetchDataFromServer{ 

    //Some something 
    [self performSelectorOnMainthread:@selector(backgroundThreadCompleted)] 
         withObject:nil 
         waitUntilDone:nil]; 
} 

에 찾고 백그라운드 스레드

[self performSelectorInBackgroungThread:@selector(fetchDataFromServer) 
           withObject:nil 
          onCompletion:nil]; 

의 메소드를 호출, 내가 당신에게 간단한 예를 들어 보겠습니다 Main Thread의 메소드와 해당 메소드의 UI 업데이트와 관련된 모든 작업 수행

동일한 프로세스를 수행하면 응용 프로그램이 충돌하지 않습니다. . 귀하의 경우에는 빈 배열 (존재하지 않는 모든 인덱스의 객체)에 액세스하려고합니다. 사전 예방 단계로 [array count]! = 0이면 배열에만 액세스하려고 시도하는 조건부 검사 반환; . 배열 값이 변경되면 [UITableView reloadData]를 사용하여 tableview를 다시로드합니다.

+0

데이터는 백그라운드 스레드에서만 가져옵니다. NSMutableArray 메시지는 주 스레드에서 변경됩니다. – Kaupo

0

메시지 배열을 변경 한 후에는 tableView를 다시로드해야합니다. 이 메시지를 사용하면 tableVlew에서 항상 업데이트되며 충돌 문제가 해결됩니다.