【问题标题】:Can't return NSMutableArray value无法返回 NSMutableArray 值
【发布时间】:2012-06-01 16:01:58
【问题描述】:

谁能告诉我为什么我不能在那里返回 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;
        });
    });
}

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

【问题讨论】:

  • 也许你可以创建一个数组属性并在方法中设置它,以后在你的类中你可以使用它。

标签: objective-c ios methods


【解决方案1】:

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

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

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

【讨论】:

  • 协议或通知?我必须读一下。我来自前端,我仍在学习 oc(难度增加了 10 倍)。非常感谢! (如果你能告诉我如何发送一个简单的通知,让我的其他方法开始运行,你会是最好的!)
  • 老兄!你是最棒的!这几点真的帮助我理解了那件事的流程。
  • 只有一个问题。通知方法(观察者)始终开启?
  • @88fsantos 您将始终拥有 [NSNotificationCenter defaultCenter] 并且您始终可以添加和删除观察者是的..
【解决方案2】:

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

【讨论】:

  • 即使你是对的,但这并不能解决发帖者的问题。
【解决方案3】:

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

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

【讨论】:

  • 嗯,我明白了。跟着你们我有点迷茫,但是tks很多!
  • 事实上,即使我在另一个视图控制器中,我也可以获取 awser 并对响应进行 NSlog。但是我在第二个视图控制器中的所有对象都变为空。而且我不能用 json 对象填充文本标签。但我可以制作 json 对象的 NSlog。
【解决方案4】:

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

还有办法把它变成类方法吗?

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

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

【讨论】:

  • 这仍然不是这里的实际问题!
  • 好的。我错过了,但是当 json 被填充时,我怎样才能返回该值?
  • 把它变成一个类方法是没有用的。
  • @bbum:我从来没有说过把它变成一个类方法可以解决这个问题。 88fsantos 刚刚问了怎么做...
猜你喜欢
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多