Reactive Cocoa — прослушивание уведомлений и управление памятью

Я хотел бы знать, были ли у кого-то проблемы с методом listenForNotification Reactive Cocoa. Я испытываю цикл сохранения, используя следующий код, и мой метод Dealloc viewController никогда не вызывается. Если я не слушаю это уведомление, мой viewController правильно освобожден

ВОТ ОБНОВЛЕНИЕ ПОЛНЫЙ БЛОК КОДА, в котором я вызываю метод для прослушивания уведомлений:

RACSignal *postSignal = [RACSignal empty];        
postSignal = [[[[NSNotificationCenter defaultCenter] rac_addObserverForName:kNotification object:self.conversation] takeUntil:self.rac_willDeallocSignal]] bind:^RACStreamBindBlock{
        return ^RACSignal *(NSNotification *note, BOOL *stop) {
            XXStatus status = [note.userInfo[@"status"] longValue];
            if (status == XXStatusPosted) {
                *stop = YES;
                return [RACSignal empty];
            } else {
                return [RACSignal error:note.userInfo[@"error"]];
            }
        };

[[[[RACSignal merge:@[uploadSignal, postSignal]] deliverOnMain] subscribeCompleted:^{
    [self doSomethingX];
} error:^(NSError *error) {
    [self doSomethingOnFail:error];
}] autoDispose:self];

Знаете ли вы, как работает управление памятью RAC для прослушивания уведомлений? Где центр уведомлений — это центр уведомлений по умолчанию в приложении. И этот метод включен в расширение категории класса NSObject.

Спасибо за Ваш ответ.


person Barbara R    schedule 14.01.2014    source источник
comment
В этом листинге кода нет кода из библиотеки ReactiveCocoa.   -  person erikprice    schedule 15.01.2014
comment
Забыл упомянуть, что метод находится в категории класса NSObject, который выполняет следующие действия: [[notificationCenter rac_addObserverForName:name object:object] takeUntil:self.rac_willDeallocSignal] ... отредактирует мой вопрос, спасибо   -  person Barbara R    schedule 16.01.2014
comment
Все еще недостаточно кода, чтобы помочь вам. Предположительно, вы подписываетесь на сигнал, возвращаемый строкой кода, которую вы разместили; если да, то вам было бы полезно показать нам тело блока подписки.   -  person erikprice    schedule 25.01.2014
comment
Спасибо, Эрик, я обновил свой пост, чтобы включить больше информации. Это базовая структура, которую я использую для прослушивания уведомлений. Я также опубликовал то, что мы сделали позже, объединив сигнал с другим сигналом. Надеюсь, это поможет, я все еще испытываю цикл сохранения.   -  person Barbara R    schedule 30.01.2014
comment
Просто примечание. Нет необходимости присваивать [RACSignal empty] переменной, а затем сразу же заменять ее другим значением.   -  person deej    schedule 12.07.2014


Ответы (1)


На самом деле это неполный фрагмент кода (у него несбалансированные разделители), поэтому, возможно, вы случайно упустили что-то, что могло бы сделать его более понятным. Но похоже, что причина, по которой у вас есть цикл сохранения, находится в самой последней строке:

}] autoDispose:self];

Эта ссылка на self не является слабой ссылкой, что означает, что блок привязки имеет сильную ссылку ("владение") на self. Если это так, self никогда не будет освобожден, поэтому self.rac_willDeallocSignal никогда не отправит значение. И это означает, что наблюдатель никогда не удаляется из NSNotificationCenter.

person erikprice    schedule 30.01.2014
comment
Эрик, не беспокойтесь о несбалансированных разделителях, это неполный код, так как мне нужно было немного изменить его, чтобы скрыть настоящий код из-за лицензий. Но хорошо, что вы правы насчет сильной ссылки! Спасибо за вашу помощь в этом! - person Barbara R; 01.02.2014