0

こんにちは、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];
    }
}

しかし、これらの機能をしばらく使っていると、テーブルのリロードの応答速度が遅くなる (クラッシュする) ことに気付きました。

実装で何かを見逃していませんか。つまり、割り当て解除などです。

4

2 に答える 2

1

メイン スレッドで確実に実行されるように、Grand Central Dispatch でイベントをキューに入れるとよい場合があります。

dispatch_async(dispatch_get_main_queue()
于 2015-01-16T06:30:38.390 に答える
1

オブザーバーを繰り返し追加すると、通知コードが通知を送信するためにますます多くのオブザーバーを循環する必要があるため、速度が低下します。これらのビューの多くをリークしているため、おそらくクラッシュしています。

dealloc にログ ステートメントを追加して、これらのインスタンスがクリーンアップされたかどうかを確認します。また、dealloc メソッドで removeObserver を使用すると、タイミングの問題が発生する可能性があります。可能であれば、dealloc の前にオブザーバーを削除してみてください。

于 2012-07-29T11:44:14.833 に答える