Cocoa touch 是否可以使用通知中心重新加载UITableView?

Cocoa touch 是否可以使用通知中心重新加载UITableView?,cocoa-touch,uitableview,notifications,Cocoa Touch,Uitableview,Notifications,我被告知不要滥用通知中心,因为我正在努力学习适当的IOS开发。我发现有几种方法可以工作,但这并不意味着它是正确的或最有效的 下面是一个例子:我编写了一个RSS提要阅读器应用程序,简而言之,我使用singleton类从web加载所有数据,还下载缩略图,然后为我的tableview缓存每个图像(tableview单元格有帖子标题、缩略图和日期) 用户可以选择随时刷新数据,这基本上将“我的所有数据”和缩略图数组设置为“零”,然后重新蚀刻新数据。(我知道我所有的数据都消失了,所以核心数据是更好的选择)

我被告知不要滥用通知中心,因为我正在努力学习适当的IOS开发。我发现有几种方法可以工作,但这并不意味着它是正确的或最有效的

下面是一个例子:我编写了一个RSS提要阅读器应用程序,简而言之,我使用singleton类从web加载所有数据,还下载缩略图,然后为我的tableview缓存每个图像(tableview单元格有帖子标题、缩略图和日期)

用户可以选择随时刷新数据,这基本上将“我的所有数据”和缩略图数组设置为“零”,然后重新蚀刻新数据。(我知道我所有的数据都消失了,所以核心数据是更好的选择)


所以这里有一个问题-我使用singleton类中的notification center(默认中心)在加载数据并准备好使用时重新加载并停止tableview控制器中的微调器。它就像一个魅力,但这是正确的IOS编程,换句话说,这是我可以展示给人们的东西(工作面试等)?(如果不是,你会怎么做?)

我认为使用通知没有任何问题。但就个人而言,我认为通知更适合于两个不相关的对象需要以某种方式相互通信的情况(或相关对象,但这种关系是通过多个节点实现的,这将导致繁琐的代码来保持对彼此的引用)。对于您的问题,表视图可以直接使用RSS单例,例如

-(void)refreshTapped {

    [[RSSFeed singleton] loadDataWithSuccessBlock:^{
        // Reload the table here
        // Make sure you use dispatch_async to perform GUI work on the main thread
    } failureBlock:^{
        // Handle Error
    }
}
其中,
RSSFeed
是处理加载数据的单例类。也许这样更好

通知的另一个用途是用于“全局”事件,如iOS经常使用的(例如,app enter background/foreground),没有人确切知道这些事件发生的原因。举个例子:如果你想,比如说,定期刷新提要(用户不按按钮),通知将是一个不错的选择(可能是唯一的选择)


我在我的应用程序中使用了很多通知,从来没有看到过性能问题。唯一需要注意的是在视图解除锁定时添加
removeObserver…

以防有人需要帮助。在Khanh的帮助下,我对我的代码做了一些修改,这对我来说是可行的(尽管他的建议更简单)


哇!非常感谢,我知道必须有另一种方法(我还没有完全消化objective-c块,以便能够在代码中使用)。这是非常好的,使用通知感觉像是“欺骗”,我宁愿不使用它,除非我真的不得不这样做。再次感谢!不客气:)积木非常有用(而且非常整洁)。花些时间学习它们,你将永远不会回到线程。使用成功/失败块进行联网是iOS中的常见模式。
- (void) refreshTableView
{
    //get data off screen
    //remove all rows and update table
    [self.myArray removeAllObjects];
    [self.tableView reloadData];

    //------------ New Thread ------//
    //do this on a new thread
    //------------------------------//
    //show spinner (this is optional)
    [self.refreshControl beginRefreshing];

    //we could create our own queue or choose to use the global queue.
    //no reason to create a queue just for this task. I use global here

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                             (unsigned long)NULL), ^(void) {
        // Load Data or reload data here
        [singleton or your load method];

        // Update tableview
        //note this has to be executed on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            //Reload data and stop spinner
            [self.tableView reloadData];

            //if you are using an activity view stop animation here
            [self.refreshControl endRefreshing];
        });
    });

}