链接多个方法调用并等待直到所有在Objective-C中完成

时间:2017-02-02 10:31:48

标签: objective-c grand-central-dispatch

说我有以下方法调用make:

-92.36699

Foo包含:

[[[[Foo init] addString:@"one"] addString:@"one"] addString:@"three"]

假设我想等到所有@implementation Foo { NSString *string; } - (void)addString:(NSString *)text { string = [string stringByAppendingString:text]; } 方法都完成并想打印“onetwothree”,但我不知道要调用多少次addString。我怎么做到这一点?我尝试使用addString执行此操作,如下所示:

dispatch_group

但这会打印出来:

一 最终字符串: 二 三

知道如何完成这项工作吗?

1 个答案:

答案 0 :(得分:0)

如果您确实想使用异步处理,可以这样做:

#import "Foo.h"

@implementation Foo {
    NSString *_string;
    dispatch_group_t _group;
    dispatch_queue_t _queue;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        _string = @"";
        _group = dispatch_group_create();
        _queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    }
    return self;
}

- (void)addStrings:(NSArray *)strings {
    dispatch_group_async(_group, _queue, ^() {
        NSMutableString *result = [NSMutableString new];

        for (NSString *str in strings) {
            [result appendString:str];
        }

        _string = [result copy];

    });
}

- (void)complete {
    dispatch_group_notify(_group, _queue, ^ {
        NSLog(@"Final String: %@", _string);
    });
}

这样打电话:

Foo *foo = [[Foo alloc] init];
[foo addStrings:@[@"one", @"two", @"three"]];
[foo complete];