2017-03-04 12 views
1

실행 취소 관리자로 일부 코드를 테스트하려고하는데 분명히 실행 취소는 동일한 실행 루프에서 실행될 때 그룹화됩니다. groupsByEvent를 해제하려고했지만 예상대로 작동하지 않습니다.유닛 테스트 NSUndoManager, Runloop - Obj-C

undoManager = [[NSUndoManager alloc] init]; 
myObject.undoManager = undoManager; 

[myObject setArticle:@"Article 1"]; 
[myObject setArticle:@"Article 2"]; 
[myObject setArticle:@"Article 3"]; 
[myObject setArticle:@"Article 4"]; 
[undoManager undo]; 

NSLog(@"myObject.article: %@", [myObject article]); //prints noarticle 

을하지만 코드가 실행될 때, 나는 항상 다시 얻을 :

- (NSString *)article 
{ 
    return _article == nil ? @"no article" : _article; 
} 
- (void)setarticle:(NSString *)article 
{ 

    if (_undoManager) 
    { 
     [(ModelGraph *)[_undoManager prepareWithInvocationTarget:self] setarticle:self.article]; 
     [_undoManager setActionarticle:@"undo set article"]; 
    } 

    NSCharacterSet *charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 
    article = [[article componentsSeparatedByCharactersInSet:charactersToRemove] componentsJoinedByString:@""]; 

    _article = article; 
} 

내 테스트

내가 가진 "어떤 기사"- 실행 취소가 발생했을 때 등을 항상 모든 취소의 다시 실행 ... 같은 runloop에 추가 되었기 때문입니다.

단지 내 실행 취소가 테스트 ... 및 아이디어로 작동하는지 테스트하고 싶습니다.

변경 될 때마다 실행 루프를 강제 실행 하시겠습니까? 실행 루프 모드를 변경 하시겠습니까?

도움을 환영합니다.

감사합니다. Chris

답변

0

아,이 방법이 효과가있는 것처럼 보입니다.

[undoManager setGroupsByEvent:NO]; 
[undoManager beginUndoGrouping]; 

dispatch_async (dispatch_get_main_queue(), ^{ 


    [myObject setArticle:@"Article 1"]; 

    [undoManager endUndoGrouping]; 

    [undoManager beginUndoGrouping]; 


    dispatch_async (dispatch_get_main_queue(), ^{ 
     [myObject setArticle:@"Article 2"]; 

     [undoManager endUndoGrouping]; 

     [undoManager undo]; 
     NSLog(@"myObject.article: %@", [myObject article]); 
    }); 
});