2017-02-02 52 views
0

說我有以下方法調用進行:鏈多個方法調用,等到所有人都在Objective-C完成

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

其中foo包含:

@implementation Foo { 
    NSString *string; 
} 

- (void)addString:(NSString *)text { 
    string = [string stringByAppendingString:text]; 
} 

說我想等待直到所有addString方法完成並且想要打印「onetwothree」,但我不知道addString將被調用多少次。我將如何實現這一目標?我試圖做到這一點使用dispatch_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); 
    }); 
} 

但這打印:

一個 最終的字符串: 兩個 三

任何想法如何,我可以完成這件事?

+1

爲什麼不使用簡單的循環? – schmidt9

+0

停止條件是什麼? –

+0

用你想要連接的單詞循環數組,在退出時輸出結果字符串 – schmidt9

回答

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]; 
相關問題