0

X 클래스의 인스턴스를 포함하는 NSMutaleArray이 있습니다. 행 i의 tableView 셀은 인덱스 i의 배열 내용을 사용하여 채워집니다.NSMutableArray는 다중 스레드에서 테이블 뷰 소스 데이터를 수정하고 셀을 구성하는 동안 블로킹을 피하는 방법

배열의 내용은 네트워크에서 들어오는 JSON 데이터를 기반으로 만들어집니다. 따라서 JSON 데이터를 이러한 객체로 변환하고 배열에 저장하는 도우미 함수가 있습니다. 객체는 배열에 저장 한 후 수정할 수 있습니다 (예 : 셀에 속한 이미지가 다운로드되고 객체에 파일 포인터가 추가됨).

현재 읽기 및 쓰기 스레드를 안전하게 dispatch_sync & dispatch_barrier_async에 넣고 있습니다. 내가 본 일부 문제

  1. 읽기를 수행해야하는 tableview 셀을 만들려면 다음을 수행하십시오. 이것은 또한 dispatch_sync를 통해 진행됩니다. 따라서 눈에 보이지 않지만 근접한 셀의 데이터가 업데이트되고 있기 때문에 차단 될 가능성이있는 것으로 보입니다. 이것을 피하는 모범 사례?

  2. dispatch_sync 및 disaptch_barrier_sync를 통해 제출 된 블록이 똑같은 색인을 제거하거나 NSMUtableArray의 동일한 색인을 제거하거나 NSMUtableDictionary의 키와 관련된 값을 수정하는 경우에만 대기하는 스마트 방법이 있습니까?

  3. 코드를 좀 더 읽기 쉽도록 만들기 위해 NSMutableArray를 하위 클래스로 분류하고 objectForIndex 및 subscript 메서드를 오버라이드하는 THreadSafeMutableArray 클래스를 만드는 방법을 생각해 봅니다. 이 접근법에 문제가 있습니까?

답변

0

NSMutableArray는 원자 속성 (기본값은 this)이어야합니다. 선언에서 비 원자로 변경했을 수 있습니다. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

애플 문서 : 설명서를 봐

이 합성 된 접근은 접근이 경우에도, 값은 항상 완전히 게터 방법으로 검색 또는 완전히 setter 메소드를 통해 설정되어 있는지 확인합니다 것을 의미한다 동시에 다른 스레드에서 호출됩니다.

@interface XYZObject : NSObject 
@property NSObject *implicitAtomicObject;   // atomic by default 
@property (atomic) NSObject *explicitAtomicObject; // explicitly marked atomic 
@end