一个类(管理列表)传播通知的好方法是什么?

时间:2011-09-28 20:16:33

标签: objective-c ios4 notifications

我正在研究iPad应用程序有很多页面供用户浏览。我正在为用户实现“喜欢”页面的功能,以便他们以后可以重新访问它。

我正在编写一个收藏夹类,用于管理用户喜欢的页面列表。当用户按下“收藏夹”按钮时,它将调用Favorites类中的addFavorite:或removeFavorite:方法。输入看起来很简单。

我的问题是:将状态更改事件传播到我的所有观点的最佳方式是什么?我在应用程序中散布了许多冗余的“最喜欢”指标,它们都需要保持同步。例如,如果用户在一个视图中收藏Pink Floyd(将星形从灰色变为黄色),则链接到Pink Floyd的所有其他视图都需要在链接旁边显示黄色星形而不是灰色星形。

我的理解是,使用Objective-C通知有很多方法可以做到这一点。我只是在寻找一个干净,可维护的产品。过去对你有用的是什么?谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

检查NSNotificationCenterNSNotification。我经常使用通知,特别是如果有多个方对共享信息感兴趣,使得委托模式很难。我遇到的通知的主要问题是订阅UITableViewCell时的通知:避免出列的单元格响应通知。

答案 1 :(得分:0)

这是我最后使用NSNotificationCenter编写的代码和UITableView的奖励积分。也许它可以帮助别人。

在收藏夹类中:

+ (void)toggleFavorite:(NSString *)artistName {
    if([favorites member:artistName]) {
        [favorites removeObject:artistName];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"favoriteRemoved"
                                                            object:artistName];
    } else {
        [favorites addObject:artistName];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"favoriteAdded"
                                                            object:artistName];
    }

    [[UserLibrary current] verifyLibrary];
}

与收藏夹互动的3个视图中的一个:表格视图,其中每个单元格都有一个星形:

// register for notifications
- (void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(favoriteAdded:)
                                                 name:@"favoriteAdded"
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(favoriteRemoved:)
                                                 name:@"favoriteRemoved"
                                               object:nil];
}

// search through visible cells for the one that needs to be starred
- (void)favoriteAdded:(NSNotification *)notification {
    NSString *artistName = notification.object;
    for(ArtistTableViewCell *cell in [(UITableView*)self.view visibleCells]) {
        if([artistName isEqualToString:cell.artistLabel.text]) {
            cell.starred = YES;
        }
    }
}

// search through visible cells for the one that needs to be de-starred
- (void)favoriteRemoved:(NSNotification *)notification {
    NSString *artistName = notification.object;
    for(ArtistTableViewCell *cell in [(UITableView*)self.view visibleCells]) {
        if([artistName isEqualToString:cell.artistLabel.text]) {
            cell.starred = NO;
        }
    }
}

// when cells are created or reused, make sure the star is set properly
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ArtistTableViewCell *cell = ...
    NSString *name = ...

    cell.starred = [Favorites isFavorite:name];
    return cell;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [super dealloc];
}

表格的单元格。注意单元格如何从TableView接收事件,这样他们就不必注册通知(并且在出列后会有通知的风险)。

- (IBAction)starPressed:(id)sender {
    NSString *name = artistLabel.text;
    [Favorites toggleFavorite:name];
}

- (void)setStarred:(bool)isFavorite {
    UIImage *img;
    if(isFavorite) {
        img = [UIImage imageNamed:@"filledstar30px"];
    } else {
        img = [UIImage imageNamed:@"emptystar30px"];
    }
    [favoriteButton setImage:img forState:UIControlStateNormal];
}