我有一台服务器,我要求提供一些数据。
我正在检查是否存在具有特定名称的图像并且我需要返回BOOL值(YES或NO),但我不知道该怎么做,因为异步请求在完成后调用回调,所以当它完成方法已经很久以前完成并且它没有返回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方法完全相同。
你们能帮助我吗?
P.P:我知道,这段代码看起来很糟糕哈哈哈,但我不知道该怎么办......答案 0 :(得分:2)
您的代码不会调用该块,因此您无法使用return
为代码提供任何内容。相反,不要再考虑返回值,并开始考虑行为。当你得到积极的回应时,你希望发生一些事情,而当你得到否定回答时,你希望发生一些事情。因此,为每个行为编写方法,并在块中的适当位置调用它们。
答案 1 :(得分: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
}
}];