서브 뷰 중 하나가 NSImageView
인 NSCollectionView
이 있습니다. 실제 이미지는 API 호출을 거친 후 웹 서버에서로드해야합니다 (실제 두 개의 네트워크 요청). 분명히 비동기 적으로 이미지를로드해야합니다. NSImageView
의 값을 NSImage
으로 모델 ID를 변환하는 NSValueTransformer
에 바인딩 할 수 있지만 어떻게 구현합니까 NSValueTransformer
? 그것은 그 transformedValue:
방법에서 즉시 돌아올 것으로 예상되는 반면, 나는 그곳에서 네트워크 요청을 해고 할 수 있습니다. 동기 네트워킹을 사용하여 스레드를 차단하고 싶지 않습니다.네트워크 이미지가있는 NSCollectionView
0
A
답변
2
실제로 즉시 반환 할 NSValueTransformer를 사용하는 대신 컬렉션보기 항목을 서브 클래 싱합니다. 각 항목에 대해이 하위 클래스의 트랜잭션을 비동기 적으로 실행합니다. 하위 클래스에 NSImage에 대한 IBOutlet을 유지하여 서버에서 응답을 받으면 jus이 IBOulet을 사용하여 이미지를 설정합니다. 이 방법을 사용하면 항목을 만들 때 해당보기 컨트롤러가 나타납니다. 서브 클래 싱하면 뷰를 제어하고 뷰를로드하는 방법을 제공합니다.
이 정보가 도움이되기를 바랍니다.
좋아, 내가 하위 클래스를 만들 때, 그것을 자신의 nib 파일을 부여합니까? 또는 컬렉션보기가 현재 살고있는 펜촉을 사용합니까? 그런 다음 이미지를 설정하기 위해 어떤 방법을 재정의합니까? setValue : forKeyPath :? 바인딩을 서브 클래스에 어떻게 연결합니까? 코드로이 모든 작업을 수행해야합니까, 아니면 인터페이스 빌더를 사용할 수 있습니까? – jsd
컬렉션보기 항목마다 itemProtype이 정의되어 있습니다. 컬렉션보기 항목을 하위 클래스로 분류하면 itemprototype을 자체에서 선택합니다. 이 새 하위 클래스에 NSImageView의 IBOutlet을 만듭니다. loadView에서 [super loadView]를 호출하고 트랜잭션을 호출하십시오. 콜백 메소드에서 데이터를 받으면 IBOutlet의 setImage 메소드를 사용하여 이미지를 설정하십시오. 하위 클래스는 비동기 호출 만 처리하기 때문에 인터페이스 빌더에서 컬렉션보기 항목의 클래스를 변경하십시오. 네가 가지고 있기를 바란다. 원한다면 나는 약간의 코드를 추가 할 것이다. –
알겠습니다. NSCollectionViewItem 하위 클래스에서 setRepresentedObject를 재정의해야했습니다. 또한 네브에서로드하도록 뷰를 참조하는지 확인하십시오. 그렇지 않으면 콘센트가 0이 될 가능성이 있습니다. – jsd