2

当我加载我的主视图时,它会自动加载带有博客文章的 JSON 提要。

我的主视图顶部栏上有一个刷新按钮。我已经成功地将它连接到一个IBAction,当点击时,我可以输出一个字符串来记录。

当我单击刷新按钮时,我试图让我的视图重新加载 JSON 提要,但这不起作用。

我究竟做错了什么?

我的 ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UICollectionViewController {
    NSArray *posts;
}

- (void)fetchPosts;

- (IBAction)refresh:(id)sender;
@end

我的 ViewController.m

...

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self fetchPosts];
}

- (IBAction)refresh:(id)sender {

    [self fetchPosts];
}

- (void)fetchPosts
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString: @"http://website.com/app/"]];

        NSError* error;

        posts = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.collectionView reloadData];
        });
    });
}
...
4

1 回答 1

2

帖子没有像您期望的那样更新,因为它是在异步块内捕获的。如果我没记错的话,实例变量一旦传递到块中就会被复制,因此对它们的更改不会反映在异步块之外,除非它们具有__block修饰符。

试试这个,

- (void)fetchPosts
{
    __block NSArray *blockPosts = posts;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString: @"http://website.com/app/"]];

        NSError* error;

        blockPosts = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.collectionView reloadData];
        });
    });
}
于 2012-10-03T02:50:22.020 回答