0

我正在尝试运行以下功能

+(NSString *)responseFromQuery:(NSString *) queryString
{
    __block NSString *response;
    __block NSError *err = nil;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{
        response = [NSString stringWithContentsOfURL:[NSURL URLWithString:queryString] encoding:NSUTF8StringEncoding error:&err];

        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"%@",response);
             if (err != nil)
             {
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert!"
                                                                    message:@"An Error has occurred" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];

                [alertView show];
                 return response;// = @"Error";
              }

            });
        });
   // return response;
}

我想在执行块后传递响应的值,但是它首先运行最后一个返回,我怎样才能使块内的返回表达式运行。我在 NSObject 类中使用这个函数根据调试它从不运行dispatch_async queue.

现在,如果我返回它会给我错误"Control may reach at the end of non void block"

4

3 回答 3

1

要完全理解objective ci中块的实现和工作,您应该查看以下链接,它解释了很多,而且说得很简单。

Objective C 块 - 简单理解

于 2013-02-01T06:40:13.073 回答
0

因为你要回来了 return response;。因为您正在返回响应,所以说“控制可能到达非 void 块的末尾”。你返回的东西意味着它是非 void 块。直接返回方法的最后一条语句。

于 2013-02-01T06:40:25.617 回答
0

您不能同时使用 dispatch_async 并返回已执行块内的值。*dispatch_async*的异步部分意味着函数将立即返回,并且不会等待块完成执行。为此,您需要不带“a”的 *dispatch_sync*。

您会遇到的问题是您正在块中发出网络请求,这可能会阻塞您的 UI 线程。我假设这个函数在主线程中被调用。

如果你想发出一个异步请求并将返回值发送给调用者,你可以在你的函数中添加一个块参数,消息的发送者将被通知。该方法将从:

+(NSString *)responseFromQuery:(NSString *) queryString;

到:

+ (void)responseFromQuery:(NSString *)queryString withBlock:(void (^)(NSString *result))block;

当你有你的响应字符串时,你会打电话:

block(response);
于 2013-02-01T06:53:01.300 回答