그물에 다른 곳에서 답변을 찾을 수 없으므로 도움을 얻을 수있었습니다.NSOperation 하위 클래스의 performSelector
NSInvocation과 같은 구체적인 하위 클래스로는 이해할 수없는 NSOperation 작업의 결과를 검색 할 수있는 시스템을 만들려고합니다.
나는 규칙에 의해 추상적이고 실행 코드의 신체를 포함하는 함수-main
을 구현하기 위해 확장해야하는 NSOperation 하위 클래스 (
TheEngine)이있다.
TheEngine는 그의 작업 선택기가 속한 theSelector
및 theObject
주의하는 것입니다 다음 초기화 기능이 포함되어 있습니다. 내 observeValueForKeyPath:ofObject:change:context:
기능에
-(id)initWithCallbackSelector:(SEL)theSelector inObject:(id)theObject
난과 같이 콜백 함수를 호출하고 싶습니다 :
NSLog(@"Some debug text to ensure this function is being called", nil);
[theObject performSelector:theSelector withObject:someData afterDelay:0];
전체 프로세스는 다음과 같이 간다 : 그것은 또한 재산 isFinished
에 대한 KV 관찰자를 등록
aViewController이 확장되어 확장 됨 TheEngine - 할 수 있습니다. Task을 호출하고 작업 대기열에 추가합니다.
TheTask* TT = [[TheTask alloc] initWithCallbackSelector:
@selector(resultHandler:) inObject:theObject];
모든 오류 또는 예외없이 예상대로 실행되는 것으로 보입니다. 그러나 실행이 observeValueForKeyPath:ofObject:change:context:
에 도달하면 콜백이 실제로 호출되지 않습니다. 나는 Obj-C에 익숙하지 않기 때문에이 유형의 스레딩에 대한 나의 이해가 맞는지 확실하지 않다.
-(id)initWithCallbackSelector:(SEL)theSelector inObject:(id)theObject{
if([self init]){
self.selectorsParentObject = theObject;
self.selectorToCallWhenFinished = theSelector;
[self addObserver:self forKeyPath:@"isFinished" options:NSKeyValueObservingOptionNew context:NULL];
return self;
}
return nil;
}
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)theObject change:(NSDictionary*)theChange context:(void*)theContext{
if([keyPath isEqualToString:@"isFinished"]){
NSLog(@"activity is finished with change: %@", theChange);
NSLog(@"target object: %@", self.selectorsParentObject);
NSLog(@"target selector: %@", NSStringFromSelector(self.selectorToCallWhenFinished));
//[self performSelectorOnMainThread:self.selectorToCallWhenFinished withObject:self.resultData waitUntilDone:NO];
[self.selectorsParentObject performSelector:@selector(selectorToCallWhenFinished) withObject:self.resultData afterDelay:0];
}
}
이 어떤 도움을 감사 :
여기에 전체 코드입니다!
팁 주셔서 감사합니다, 당신의 직감 올바른 밝혀졌다 - 내가 만든 변경 사항을 게시 할 것입니다 :) – aktar