无法返回NSMutableArray值

时间:2012-06-01 16:01:59

标签: objective-c ios methods

任何人都可以告诉我为什么我不能在那里返回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 个答案:

答案 0 :(得分:3)

json(NSMutableArray *),而您的函数返回(NSMutableArray)

答案 1 :(得分:3)

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

  • 来电者调用方法
  • 方法执行,在另一个线程上启动块并返回
  • 来电者继续开展业务
  • 最终执行该块,为了回到调用者,我们需要使用协议或通知(其他方式,但这两个是最好的imo)

如果您想了解NSNotifications,请查看this questions

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

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

  

无论如何要把它变成一种类方法?

要回答你的第二个问题,如果我做对了:你必须将开头的破折号更改为加号。这相当于Java中的关键字“static”:

+ (NSMutableArray*)makeServiceRequest:(UIViewController *)sender