NSOperationQueue가있는 테스트 응용 프로그램을 개발 중입니다. NSInvocationOperation을 만들고 해당 작업의 "isFinished"속성을 관찰하고 있습니다. 이상하게도 observeValueForKeyPath가 가끔씩 만 호출됩니다. 매번 호출 할 때 변경해야 할 사항을 이해할 수 없습니다. 도와주세요.observeValueForKeyPath가 호출되지 않습니다.
이-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
........//initialization
queue = [NSOperationQueue new];
operation=[NSInvocationOperation new];
operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(CreateOperationWithContext:) object:context];
[operation addObserver:self forKeyPath:@"isFinished" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
[queue addOperation:operation];
..... // launch the view controller
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"isFinished"]) {
NSLog(@"came in");
[operation removeObserver:self forKeyPath:@"isFinished"];
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
'CreateOperationWithContext'에서 호출 여부와 확인 방법을 확인하는 방법은 무엇입니까? – Wain
알림을 보지 못한 경우 여전히 'isFinished' KVN을 보지 못했지만 작업이 성공적으로 생성되고 실행되고 완료되었는지 100 % 확신합니까? 예를 들어,'@selector (CreateOperationWithContext :)'를 해결할 수 없었던 경우, 조작은 최초로 생성되지 않습니다. 또는'CreateOperationWithContext :'가 완료되지 못했다면 (무한 루프 등), 연산은 완료되지 않을 것이다. 그럼에도 불구하고'isFinished' 키에 대한 옵저버를 추가하는 대신 작업을위한 completionBlock을 설정하는 것이 좋습니다. 더 깨끗하고 안정적입니다. – Rob
안녕하세요 Rob 및 Vain, 답장을 보내 주셔서 감사합니다. CreateOperationWithContext : 함수는 매번 호출되고 성공적으로 실행됩니다. 함수에서 데이터베이스를 업데이트하고 매번 업데이트를 볼 수 있습니다. 관찰자 만이 통보를받지 않습니다. – user2122350