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

链接多个方法调用,并等待在Objective-C中完成所有调用,objective-c,grand-central-dispatch,Objective C,Grand Central Dispatch,假设我要进行以下方法调用: [[[[Foo init] addString:@"one"] addString:@"one"] addString:@"three"] 其中Foo包含: @implementation Foo { NSString *string; } - (void)addString:(NSString *)text { string = [string stringByAppendingString:text]; } 假设我想等到所有的addString方法都

假设我要进行以下方法调用:

[[[[Foo init] addString:@"one"] addString:@"one"] addString:@"three"]
其中Foo包含:

@implementation Foo {
  NSString *string;
}

- (void)addString:(NSString *)text {
  string = [string stringByAppendingString:text];
}
假设我想等到所有的
addString
方法都完成后再打印“onetwotree”,但我不知道要调用多少次
addString
。我将如何实现这一点?我尝试使用
dispatch\u group
执行此操作,如下所示:

@implementation Foo {
  NSString *string;
}

- (id)init {
  // setup
  [self complete];
  string = @"";
}

- (void)addString:(NSString *)text {
    dispatch_group_async(group, queue, ^ {
      string = [string stringByAppendingString:text];
      NSLog(@"%@", text);
   }
}

- (void)complete {
  dispatch_group_notify(group,queue, 0), ^ {
    NSLog(@"Final String: %@", string);
  });
}
但这表明:

一个 最终字符串: 两个 三


你知道我该怎么做吗?

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

#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];
请这样称呼:

#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];

为什么不使用简单循环?停止条件是什么?循环通过数组,其中包含要连接的单词,在退出输出时生成字符串这里的问题是,我没有ping循环以开始迭代单词的事件。检查我的答案