2010-07-01 3 views
0

데이터를 변경 가능한 배열로로드하고 자체적으로 속성으로 저장하는 다른 클래스를 초기화하는 ViewController가 있습니다. 여기 addObserver 질문, 데이터로드 여부를 확인하십시오.

내의 ViewController의 초기화 코드 :

-(id) initWithCollectionID:(NSString *)aCollectionID { 
    if (self = [super init]){ 
     collectionID=aCollectionID; 
     dataSource = [[CollectionListDataSource alloc] initWithCollectionID:collectionID]; 
    } 
    return self; 
} 

그것이 내가 dataSource.loaded = @ "true"로 설정 속성 dataSource.collectionItems을의로는 dataSource가 모든 데이터를로드 한 후,

addObserver를 사용하여 해당 값을보고 내 ViewController에서 함수를 실행하는 방법은 무엇입니까? 나는 가정 것 같은

무엇인가 : 다음

[self addObserver:dataSource forKeyPath:@"loaded" options:NSKeyValueChangeNewKey context:nil]; 

어떻게해야합니까?

답변

1

코드가 그대로이므로 알림 사용 여부에 관계없이 데이터가로드 될 때까지 일시 중지됩니다. CollectionListDataSource 객체 (또한로드 데이터를 의미 내가 추정) 자체의 인스턴스를 돌려 자신의 초기화를 완료 할 때까지 ...

dataSource = [[CollectionListDataSource alloc] initWithCollectionID:collectionID]; 

: 그것은 과거를 진행하지 않습니다.

보기 컨트롤러가 계속 초기화되는 동안 CollectionListDataSource 개체를로드하려면 다른 스레드에 CollectionListDataSource 개체를 넣어야합니다. 그러나 별도의 스레드에서 실행되는 특성 개체를 가질 수는 없습니다.

그런 농구대를 뛰어 넘을 필요가 거의 없습니다. 이 배열이 매우 큰 경우가 아니라면 (10k + 객체) 대부분 걱정할 필요가 없습니다. 대부분의 경우 뷰가 기능을 수행하기 전에 데이터가 필요하므로 데이터가 없어도 뷰를 계속 진행할 필요가 없습니다.

실제로 다른 개체의 속성을 관찰해야하는 경우 자세한 내용은 Key-Value Programming Guide: Registering For Key-Value Observing을 참조하십시오.

+0

NSURLRequest를 사용하는 웹 서비스와 비 블로킹 (nonblocking)을 사용하므로 실제로 일시 중지되지 않습니다. 즉,로드하고 난 다음에는 데이터를 얻은 후에 보려고하는 문제입니다. – Slee

+0

다른 곳에서 CollectionListDataSource를 파킹시켜야하거나, 다른 메소드로 데이터를로드해야 할 것입니다. 지금은 데이터가로드 될 때까지 코드 초기화가 중지됩니다. 백그라운드 스레드에 데이터를로드하여 스레드가 완료되면보기 컨트롤러에 알리고 싶을 것입니다. – TechZen

+0

이 예를 시도해보십시오. 핵심 데이터이지만 원칙은 동일합니다. http://developer.apple.com/iphone/library/samplecode/TopSongs/Listings/ReadMe_txt.html#//apple_ref/doc/uid/DTS40008925-ReadMe_txt-DontLinkElementID_18 – TechZen

관련 문제