2012-10-03 60 views
2

当我加载我的主视图时,它会自动加载包含博客文章的JSON供稿。为什么这个UIButton/IBAction不能刷新我的页面?

我在主视图的顶部栏上有一个刷新按钮。我已经成功将它连接到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]; 
     }); 
    }); 
} 
... 
+0

是否成功下载数据? – DrummerB

+0

你想更新UILabel吗?你的UILabel在哪里?它在另一个视图控制器中吗?你想刷新整个视图控制器吗?视图控制器在切换到另一个时进行“刷新”。 – stackOverFlew

+0

您正在尝试重新加载视图而不实际重新加载它? collectionView是否已成功连接到接口构建器引用插座的UITableView?请提供更多信息和更多的代码。 – stackOverFlew

回答

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]; 
        }); 
    }); 
} 
+0

Thanks @holex :) – haroldcampbell

+0

harold so this代码将被调用初始加载并在一次点击刷新时调用?或者它应该是特定的刷新? – pepe

+0

是的。它被称为初始加载,并且每当有人点击刷新按钮... ...恕我直言 – haroldcampbell

相关问题