Objective c 使用NSUndoManager、Runloop-Obj-C进行单元测试

Objective c 使用NSUndoManager、Runloop-Obj-C进行单元测试,objective-c,nsrunloop,nsundomanager,Objective C,Nsrunloop,Nsundomanager,我试图用一个撤销管理器测试一些代码,但显然,当在同一个运行循环中运行时,撤销会被分组。我尝试过关闭groupsByEvent,但效果不理想 - (NSString *)article { return _article == nil ? @"no article" : _article; } - (void)setarticle:(NSString *)article { if (_undoManager) { [(ModelGraph *)[_undo

我试图用一个撤销管理器测试一些代码,但显然,当在同一个运行循环中运行时,撤销会被分组。我尝试过关闭groupsByEvent,但效果不理想

- (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
但是当代码运行时,我总是返回:“no article”-当撤销发生时,它总是运行所有撤销的back…因为它们被添加到同一个runloop中

我只是想测试我的撤销是否与测试一起工作…还有想法

可能在每次更改后强制运行循环启动?更改运行循环模式

欢迎任何帮助


谢谢,克里斯。啊,这似乎管用,但看起来不是最好的

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