在等待上一个执行结束时,循环执行代码块。

5

我有一段代码,它会循环遍历数组并对其执行块代码。目前它看起来像这样:

for (NSString *myString in myArray) {

    [self doSomethingToString:myString WithCompletion:^(BOOL completion) {
        string = [NSString stringByAppendingString:@"Test"];
    }];

}

我希望在开始下一个迭代之前等待上一次迭代完成。我该如何循环执行类似于这样的代码块?

嘿,如果你找到了解决方案,请在这里发布,这将有助于其他人。 - Anand Suthar
如果你编写了 doSomethingToString:withCompletion: 方法,只需更改该方法以避免在不同线程上执行任务即可。 - JeremyP
3个回答

9

试试这个

    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    for (NSString *myString in myArray) {

        [self doSomethingToString:myString WithCompletion:^(BOOL completion) {
            string = [NSString stringByAppendingString:@"Test"];
            dispatch_semaphore_signal(sema);
        }];

        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
        dispatch_release(sema);

    }

3
这是对问题的最佳严格回答,但当然,这会产生效果(就像所有正确的答案一样),即将所有迭代按顺序进行,就好像在单个线程上执行一样,但还带有使用的并发模型以及信号量调用等开销。 - JeremyP
ARC 不需要 dispatch_release(sema);。 - Abdurrahman Mubeen Ali

0

你可以使用

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
   string = [NSString stringByAppendingString:@"Test"];
}];

0

Swift 3.1

var sema = DispatchSemaphore(value: 0)
for myString: String in myArray {
    doSomething(to: myString, withCompletion: {(_ completion: Bool) -> Void in
        string = String + ("Test")
        dispatch_semaphore_signal(sema)
    })
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
    dispatch_release(sema)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接