Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
_block MyViewController *weakSelf = self;
auto observerBlock = ^(id target, NSString *stringParam, BOOL boolParam)
{
[weakSelf doSomethingWithString:stringParam];
};
необходимость передавать не только селектор, но и объект, относительно которого применяется этот селектор, я уже написал, прочтите ещё раз:)
На него то и останется ссылка.
__weak ссылку, и никаких проблем.так же идентификация событий идёт по строковому идентификатору, что не есть хорошо. Ну и производительность такого решения оставляет желать лучшего, как и API.и
но API сводит все его прелести на нет
// some place
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onSomethingChanged:) name:kMyClassSomethingChanged object:someObject];
// other place
[[NSNotificationCenter defaultCenter] postNotification:kMyClassSomethingChanged object:self userInfo:someUserInfoDictionary];
typedef const struct objc_selector
{
void *sel_id;
const char *sel_types;
} *SEL;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onSomethingChanged:) name:@"somethingHappened" object:someObject];
Разве API NC выглядят хуже, чем плюсовые шаблоны в Objective-C++ коде?
Я боюсь отсутствия какой-либо проверки и хотя бы warning-а когда программист пишет...
Что будет, если программист А создал константу… а потом программист B… тоже случайно завёл такую костанту
Ну, это уже претензия к слабой типизации.
Если они создадут эти константы в одном проекте, то будет ошибка линковки. Если в разных — то всем пофигу, разве нет? )
#define kMyGlobalSomethingHappened = @"MyGlobalSomethingHappened"
#define MyGlobalSomethingHappened = @"MyGlobalSomethingHappened"
#define MY_GLOBAL_SOMETHING_HAPPENED = @"MyGlobalSomethingHappened"
Вы вообще мои сообщения читаете
Вот вам пример конфликта
NSString *.один из программистов не учел правило написания констант NC
Не существует универсального решения
Вам приходилось работать в больших командах программистов?
В outsource?
// декларация события в .h
@property (nonatomic,readonly) RSEvent *viewDidLoadEvent;
// инициализация .m
_viewDidLoadEvent = [RSEvent new];
// запускаем событие
[self.viewDidLoadEvent fire];
// подписываемся
[self.viewController.viewDidLoadEvent addHandler:^{
// ...
} owner:self];
owner: при уничтожении owner handler автоматически удалится из события.//.h
-(NSString *)addViewDidLoadHandler:(void(^)(UIView *view))handler owner:(id)owner;
-(void)removeHandler:(NSString *)uid;
//.m
-(NSString *)addViewDidLoadHandler:(void(^)(UIView *view))handler owner:(id)owner{
__typeof(self) __weak weakSelf = self;
return [self.viewDidLoadEvent addHandler:^{
__typeof(self) strongSelf = weakSelf;
if (!strongSelf) return;
if (handler) handler(strongSelf.view);
} owner:owner];
}
-(void)removeHandler:(NSString *)uid{
[self.viewDidLoadEvent removeHandler:uid];
}
// подписка
[self.viewController addViewDidLoadHandler:^(UIView *view) {
// ...
} owner:self];
TLSignal<UIView *> *signal. Зачем он вообще нужен? На мой взгляд, это только усложняет интерфейс. А выше, кстати, сказано другое: что первым параметром передаётся «держатель» сигнала.handler. Это неудобно, а иногда и невозможно. Возможно, лучше использовать строковые токены?
Observer Pattern со строгой типизацией или зачем нам нужен Objective-C++