2014-05-19 1 views
0

OS X 프로그래밍에 관한 책을 다시 읽어보고 배열 컨트롤러, tableView 등을 사용하여 문서 앱을 설정하십시오.이 장에서는 NSInvocation을 사용하여 수동으로 실행 취소 지원을 구현합니다. 이 장에서는 직원 작성 메서드를 수동으로 추가하고 NSArrayController에 콘센트를 추가하고 배열 컨트롤러 대신 새 메서드에 추가 단추를 연결해야합니다.이 유스 케이스에서 GCD dispatchAfter()를 사용할 때 어떤 문제가 발생할 수 있습니까?

-(void)insertObject:(Person *)object inEmployeesAtIndex:(NSUInteger)index { 
NSUndoManager* undoManager = [self undoManager]; 

[[undoManager prepareWithInvocationTarget:self]removeObjectFromEmployeesAtIndex:index]; 

if (![undoManager isUndoing]) { 
    [undoManager setActionName:@"Add Person"]; 
} 
[self startObservingPerson:object]; 

[[self employees]insertObject:object atIndex:index]; 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    // Wait then start editing 
    [[self tableView]editColumn:0 row:index withEvent:nil select:YES]; 
}); 

}

이 확인 작업은 (조금 바보 보인다),하지만 문제는이에서 발생할 수있는 무엇인지 궁금 해서요 :

대신에 나는 새로운 객체를 삽입하는 내 방법이했다. 나는 애니메이션을 끝낸 후에 코드를 실행하기 위해 다른 곳에서도이 작업을 수행했다.

미리 감사드립니다.

답변

1

-editColumn:row:withEvent:select:의 호출을 지연 하시겠습니까?

어쨌든이 -insertObject:... 메서드가 끝날 때와 전달 된 작업이 실행될 때까지 다른 작업이 수행 될 수 있습니다. 아마도 index이 방금 추가 한 직원을 참조하지 않도록 테이블보기의 내용을 변경하는 것이 있습니다.

+0

블록의 코드가 실행되기 전에 메서드가 여전히 반환됩니까? –

+0

"Still"? 네가하는 말을 잘 모르겠다. 예,'dispatch_after()'또는'dispatch_async()'를 사용하여 태스크를 디스패치하면 호출자는 해당 태스크가 완료 될 때까지 기다리지 않고 계속 진행합니다. –

+0

"왜 -editColumn : row : withEvent : select :?"호출을 지연시키고 있습니까? " 내 배열 컨트롤러가 테이블보기를 업데이트하지 않는 것 같습니다. 언젠가는 메서드가 반환 된 후까지 테이블보기를 업데이트하지 않습니다. 그래서 나는 dispatch_after로 재생합니다. –