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 に答える