如何知道块何时完成

时间:2014-10-25 15:30:34

标签: objective-c objective-c-blocks

有人可以提供帮助,

我有一个NSMutablearray,其中包含大约1000个数据条目。

我想要做的是逐个浏览这些条目并将它们发送到带有HTTP请求的服务器。

然而,重要的是我一次只发送一个,所以我有以下伪代码

for(int i =0; i < array.count; i++)
{
    [ServerLayer ServerUploadRow:[array objectAtIndex:i] : ^void (int ReturnValue, BOOL err){
        if(err == true)
        {
            //Do some local stuff here.
        }
    }];
}

我理想的做法就是拥有以下内容

for(int i =0; i < array.count; i++)
{
    //Wait here till i know that we not waiting on a block to complete

    [ServerLayer ServerUploadRow:[array objectAtIndex:i] : ^void (int ReturnValue, BOOL err){
        if(err == true)
        {
            //Do some local stuff here.
            //Signify that we done
        }
    }];
}

函数ServerUploadRow只发送HTTP命令。

由于

1 个答案:

答案 0 :(得分:2)

假设ServerUploadRow异步运行,您可以让请求在前一个请求的完成块中启动下一个请求:

- (void)initiateRequestNumber:(NSInteger)index 
{
    [ServerLayer ServerUploadRow:array[index] : ^(int ReturnValue, BOOL err){
        if (err == true) {
            //Do some local stuff here.
        } else {
            NSInteger nextIndex = index + 1;

            if (nextIndex < array.count) {
                [self initiateRequestNumber:nextIndex];
            } else {
                // do whatever you want now that everything is done
            }
        }
    }];
}

你从以下开始:

[self initiateRequestNumber:0];

如果您可以同时发出这些请求,或者更好地将所有这些请求合并到一个请求中,那么速度会快得多。我建议考虑重构您的网络服务,以便在可能的情况下启用此功能。但是按顺序提交1000个网络请求的速度非常慢(因为您将遭受1000次网络延迟)。