0

谁能告诉我为什么我不能在那里返回 NSMutableArray:

-(NSMutableArray)makeServiceRequest:(UIViewController *)sender
{
     NSMutableString *urlString= [NSString stringWithFormat:@"http://www.servicedata/%@", _searchValue];

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:
                        [NSURL URLWithString: urlString]];

        NSError* error;

        NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:data
                                                               options:kNilOptions
                                                                 error:&error];

        dispatch_async(dispatch_get_main_queue(), ^(){
            NSLog(@"json arrived");
            return json;
        });
    });
}

我已经在头文件中很好地声明了它。有没有办法把它变成一个类方法?

4

4 回答 4

3

json是一段(NSMutableArray *)时间你的函数返回(NSMutableArray)

于 2012-06-01T16:04:10.820 回答
3

你不能这样做,你调度块相当于创建另一个线程并让它离开,当你的块执行方法 makeServiceRequest 已经执行并且不再在范围内时,你需要做什么通知调用者他们的请求是通过协议或通知完成的......流程就像

  • 调用者调用方法
  • 方法执行,在不同的线程上启动块并返回
  • 来电者继续他的事业
  • 最终该块被执行,为了返回调用者,我们需要使用协议或通知(还有其他方法,但这两种是最好的 imo)

如果您想了解 NSNotifications,请查看此问题

于 2012-06-01T16:04:43.630 回答
1

该 return 语句位于块内。将块视为其自身的某种功能。块具有参数和返回类型,就像函数或方法一样。dispatch_async 不接受任何参数,也没有返回类型,因此它不希望您尝试在该块内返回。

此外,该块可能会在下一个运行循环中运行。在代码运行时,您将退出 makeServiceRequest: 方法,并且该方法不会返回任何内容。我猜该代码中有一个警告,上面写着“控制到达非无效函数的结尾”。

于 2012-06-01T16:06:24.223 回答
-1

就像Anila解释的那样,你错过了一个 *. 要了解这意味着什么,您应该阅读有关 Objective-C 内容的一些“入门”。例如 Apple 的 Objective-C 入门教程:Learning Objective-C: A Primer

反正有办法把它变成一个类方法吗?

并回答你第二个问题,如果我没猜错的话:你必须把开头的破折号改成加号。这相当于 Java 中的关键字“static”:

+ (NSMutableArray*)makeServiceRequest:(UIViewController *)sender
于 2012-06-01T16:04:38.373 回答