2017-03-04 33 views
1

我想用一个撤消管理器测试一些代码,但显然,撤消的时候在同一个运行循环中运行时分组。我试图关闭groupsByEvent,但它不能按预期工作。单元测试与NSUndoManager,Runloop - Obj-C

- (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; 
} 

,并在我的测试,我有:

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 

但代码运行时,我总是回来:“没有了” - 当撤消发生时,它总是运行所有撤消的背...因为它们是在同一个循环中添加的。

我只想测试我的撤消是否正在进行测试......和想法?

也许强迫运行循环在每次更改后触发?更改运行循环模式?

任何帮助欢迎。

谢谢,克里斯

回答

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]); 
    }); 
});