2012-03-13 4 views
0

UITableViewController 하위 클래스 (MusicTableVC)에서 인스턴스화 된 사용자 지정 NSOperation 개체가 있습니다. NSOperation 객체는 백그라운드에서 URL의 NSArray를 채워야하므로 UI가 멈추지 않지만 그 배열을 주 스레드로 다시 보내야만 MusicTableVC 인스턴스가이 작업을 수행 할 수 있습니다. performSelectorOnMainThread : 배열을 MusicTableVC에 다시 보내야하지만 MusicTableVC의 인스턴스에 대한 포인터가 필요하다는 것을 알고 있습니다.performSelectorOnMainThread를 사용할 때 부모 개체를 대상으로 지정하는 방법?

NSOperation에 init 메소드를 만드는 것에 대해 생각하고있었습니다. 자신에 대한 포인터를 전달하고 그것을 사용하지만 어쩌면 내가 뭔가를 놓치고 initWithParent?

@synthesize parent; 

- (id)initWithParent:(MusicTableVC*) musicTableViewController 
{ 
    if(self = [super init]) 
    { 
     self.parent = musicTableViewController; 
    } 
    return self; 
} 

-(void) main 
} 
[parent performSelectorOnMainThread:@selector(arrayFinishedLoading:) 
              withObject:playlist 
             waitUntilDone:YES]; 

} 

답변

0

의 상태가 끝나면 결과로 무언가를하십시오. 당신은 뷰 컨트롤러에서 작업을 만들 때, 같은 것을 할 :

NSOperation *myOp = [[NSOperation alloc] init]; 
[myOp addObserver:self forKeyPath:@"isFinished" options:NSKeyValueObservingOptionsNew context:NULL]; 

다음 KVO 콜백 메소드 추가

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSOperation *myOp = (NSOperation *)object; 
    [myOp removeObserver:self forKeyPath:keyPath]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // reload the table with the results here 
    }); 
} 
1

난 당신이 블록과 그랜드 센트럴 디스패치와 더 잘 할 것이라고 생각 : 그 일을 한 가지 방법이 있지만, 일반적인 패턴을 발견했을 NSOperation의 부모를하는 것입니다

dispatch_async(dispatch_get_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{ 
    // This is called in background, not blocking the UI 
    [self populateArrayFromURL]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // This is called on the main thread 
     [self reportStuffDone]; 
    }); 
}); 
+0

죄송합니다, iOS – TijuanaKez

+0

GCD와 블록 모두 iOS에서 오랫동안 사용 가능합니다. 알고 계십니까? – zoul

+0

실제로 그 사실을 몰랐습니다. GDC 덕분에 읽어야 할 것입니다. – TijuanaKez

0

귀하의 방법은 괜찮습니다, 내가 부를 것이다 initWithDelegate을하고 정의 의논하십시오. 그냥 대리인을 전달하면 작업이 성공했는지 여부를 알 수 있습니다.

최근 쓸모없는 대리자에서 GCD로 전환 했으므로 대신 initWithSuccessBlock과 같은 것을 만들어 메인 큐로 보냅니다. 주의 할 점은 이것을 사용하기로 결정했다면 블록이 복사되었는지 확인해야합니다.

관련 문제