在iPhone中调用阻止功能

时间:2013-02-01 06:36:12

标签: iphone objective-c arrays

我正在尝试运行以下函数

+(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"

3 个答案:

答案 0 :(得分:1)

要完全理解目标c中块的实现和工作,我认为您应该查看以下链接,它解释了很多,并且它非常简单。

Objective C Blocks - Simple Understanding

答案 1 :(得分:0)

因为您要返回return response;。因为你正在回复它所说的“控制可能会在非空白块结束时到达”。你返回的东西意味着它是非空洞的。直接返回最后一个方法陈述。

答案 2 :(得分:0)

您不能使用dispatch_async并同时返回已执行块内的值。 * dispatch_async *的 async 部分表示该函数将立即返回,不会等待块完成执行。为此,您需要* dispatch_sync *而不需要'a'。

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

如果要发出异步请求并将返回值发送给调用者,可以向函数添加一个块参数,以便通知消息的发送者。该方法将来自:

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

要:

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

当您收到响应字符串时,请致电:

block(response);