我正在尝试运行以下函数
+(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"
答案 0 :(得分:1)
要完全理解目标c中块的实现和工作,我认为您应该查看以下链接,它解释了很多,并且它非常简单。
答案 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);