【问题标题】:Why is my adding of my object to an NSMutableArray not working?为什么我将对象添加到 NSMutableArray 不起作用?
【发布时间】:2013-03-23 20:45:52
【问题描述】:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            NSError *error = nil;

            NSURL *urlRequest = [NSURL URLWithString:[NSString stringWithFormat:@"...", URL]];
            NSString *json = [NSString stringWithContentsOfURL:urlRequest
                                        encoding:NSASCIIStringEncoding
                                        error:&error];

            JKParseOptionFlags options = JKParseOptionStrict;
            NSDictionary *results = [json objectFromJSONStringWithParseOptions:options];

            NSString *body = [[results objectForKey:@"item"] objectForKey:@"description"];

            Article *article = [[Article alloc] initWithTitle:title URL:URL body:body];
            [self.articles insertObject:article atIndex:0];
        });

除此之外,我有[self.tableView reloadData];,但如果我在此之后立即调用NSLog(@"%d", self.articles.count);,它会返回0。为什么不添加它?如果我在该块中调用 NSLog 访问文章的 body 属性,它将打印它,因此该对象似乎被创建得很好。是的,它所在的方法确实被调用了(通过 viewDidLoad)。

【问题讨论】:

  • 这样做时,这通常意味着我实际上还没有为 self.articles 分配 NSMutableArray 对象,而我现在只有一个 nil 指针。

标签: ios objective-c xcode ios6 grand-central-dispatch


【解决方案1】:

body 是异步执行的,所以直到你的函数完成一段时间后它才会开始运行那个 body。因此,您只需将一些代码放入队列(稍后才会运行),然后检查文章是否已添加到列表中(稍后才会添加)。

如果你检查代码内部,那实际上是稍后检查,当队列完成运行代码时......

【讨论】:

    【解决方案2】:

    如果没有看到您的 articles 对象的声明,我无法告诉您更多信息,但这通常意味着您尝试使用的 NSMutableArray 对象为零。在记录文章的 body 属性的同时,尝试记录 articles 对象。如果您将数组声明为

    NSMutableArray *articles;
    

    那么它就不起作用了——articles 仍然是 nil 并且不能接受对象。使用以下选项之一声明/实例化:

    NSMutableArray *articles = [NSMutableArray array];
    

    NSMutableArray *articles = [[NSMutableArray alloc] init];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多