3

我有一个服务器,我在其中请求一些数据。

我正在检查是否存在具有特定名称的图像并且我需要返回一个 BOOL 值(是或否),但我不知道该怎么做,因为异步请求在完成时会调用回调,所以当它的完成方法很久以前就完成了,它不返回 BOOL 值,我不使用同步请求,因为它阻塞了主线程。

这是我的代码(我知道这是错误的,但我还是写了它来展示我想做的一个例子,因为我的英语不太好):

- (BOOL)imageDoesExistsOnTheServer:(NSString *)imageName {
    BOOL exists;

    NSString * query = [[NSString alloc] initWithFormat:@"request=IMAGE&imageName=%@", imageName];

    DREasyURLRequest * imageExistsRequest = [[DREasyURLRequest alloc] initForSendDataToServerWithURLString:@"http://xxxxx.xxxxx/file.php" query:query];

    [imageExistsRequest sendAsynchronouslyWithCompletionForStringAsResponse:^(NSString *receivedResponse) {
        if ([receivedResponse isEqualToString:@"YES"]) {
            __block BOOL exists = YES;
        } else {
            __block BOOL exists = NO;
        }
    }];

    return exists;
}

(DREasyURLRequest 是我为保存一些代码而创建的 NSMutableURLRequest 的子类,但 sendAsynchronouslyWithCompletionForStringAsResponse: 与异步 NSMutableURLRequest 方法完全相同。

你们能帮帮我吗?

PD:我知道,这段代码看起来很糟糕哈哈哈,但我不知道该怎么做......

4

2 回答 2

3

您的代码不会调用该块,因此您不能使用return它为您的代码提供任何内容。相反,停止考虑返回值,并开始考虑行为。当你得到积极的回应时,你希望发生一些事情,当你得到消极的回应时,你希望发生一些事情。因此,为每种行为编写方法,并在块中的适当位置调用它们。

于 2013-01-04T16:51:19.537 回答
2

你不能返回这样的值。该函数不会等到块的异步执行完成。处理此类情况的惯用模式是保持控制流的异步特性并相应地实现回调逻辑。例如,您可以使用委托或传入另一个块,它会通知您图像是否存在:

- (BOOL)imageDoesExistsOnTheServer:(NSString *)imageName completion:(void ^(BOOL exists)compl {
    // etc.
    [imageExistsRequest sendAsynchronouslyWithCompletionForStringAsResponse:^(NSString *receivedResponse) {
    if ([receivedResponse isEqualToString:@"YES"]) {
        compl(YES);
    } else {
        compl(NO);
    }
}];

并这样称呼它:

[self imageDoesExistOnTheServer:@"Foo.png" completion:^(BOOL exists) {
    if (exists) {
        // exists
    }
}];
于 2013-01-04T16:53:40.157 回答