使用NSNotification defaultCenter响应缓慢

时间:2012-07-28 22:42:04

标签: ios performance uitableview uibutton nsnotificationcenter

您好我正在使用NSNotificationCenter defaultCenter在我的应用中实现“喜欢”和“评论”功能。

//In Answer Table View
@implementation AnswerTableView

- (id)initWithParentController:(UIViewController *)pController andResourcePath:(NSString *)thisResourcePath {

    ....
    // Notification to reload table when a comment is submitted
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(reloadTable)
                                                 name:@"Comment Submitted"
                                               object:nil];

    // Notification to reload table when an answer is liked
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(reloadTable)
                                                 name:@"Answer Liked"
                                               object:nil];


}

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

//In custom button implementation - THIS BUTTON IS CREATED IN EVERY CELL OF THE TABLEVIEW
@implementation UICustomButton

-(id)initWithButtonType:(NSString *)type {
    self = [super init];
    if (self) {
       //Initialization done here
    }
    return self;
}


- (void)buttonPressed {
    if ([btnType isEqualToString:@"like"]) {
       [[NSNotificationCenter defaultCenter] postNotificationName:@"Answer Liked" object:nil];
    }
    else if ([btnType isEqualToString:@"comment"]) {
       [[NSNotificationCenter defaultCenter] postNotificationName:@"Comment Submitted" object:nil];
    }
}

但是,我意识到在使用这些函数一段时间后,表重新加载的响应速度变得越来越慢(到崩溃的程度)。

我是否错过了实施中的任何内容,即解除分配等等

2 个答案:

答案 0 :(得分:1)

您反复添加观察者并且发生减速,因为通知代码必须循环越来越多的观察者来发送通知。你可能正在崩溃,因为你泄露了很多这些观点。

在dealloc中放置一条日志语句,以查看是否清理过这些实例。在dealloc方法中,removeObserver也可能存在时序问题。如果可以的话,尝试在dealloc之前删除观察者。

答案 1 :(得分:1)

有时可以使用Grand Central Dispatch对事件进行排队,以确保它在主线程上运行。

dispatch_async(dispatch_get_main_queue()