2

我被告知不要滥用通知中心,因为我正在尝试学习正确的 IOS 开发。我发现有几种做事的方法是有效的,但这并不意味着它是正确的或最有效的。

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

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

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

4

2 回答 2

3

我认为使用通知没有任何问题。但我个人认为通知更适合两个不相关的对象需要以某种方式相互通信(或相关对象,但关系是通过多个节点,这将导致繁琐的代码来保持相互引用)的情况。对于您的问题,表格视图可以直接使用 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 经常使用(例如应用程序进入后台/前台),没有人确切知道它们发生的原因。例如:如果您想定期刷新提要(无需用户按下按钮),通知将是一个不错的选择(可能是唯一的选择)。

我在我的应用程序中使用了很多通知,但从未见过性能问题。唯一的问题是removeObserver...在您的视图被解除分配时添加。

于 2013-06-22T15:03:13.980 回答
0

万一有人需要这方面的帮助。在 Khanh 的帮助下,我对代码进行了一些更改,这对我有用(尽管他的建议更简单)。

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

}
于 2013-06-23T17:59:56.547 回答