1
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)。

4

2 回答 2

3

主体是异步执行的,因此在您的函数完成后的某个时间之前它不会开始运行该主体。因此,您所做的只是将一些代码放在队列中(直到稍后才会运行),并检查文章是否已添加到列表中(直到稍后才会添加)。

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

于 2013-03-23T21:01:21.787 回答
0

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

NSMutableArray *articles;

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

NSMutableArray *articles = [NSMutableArray array];

或者

NSMutableArray *articles = [[NSMutableArray alloc] init];
于 2013-03-23T20:59:16.397 回答