Почему действие, инициируемое NSTimer, не может быть указано блоком?
При создании таймера есть только эти опции:
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats;
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds invocation:(NSInvocation *)invocation repeats:(BOOL)repeats;
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats;
Как видите, не существует фабричного метода, который создает таймер с блоком в качестве выполняющего его действия.
Почему это? или я что-то упустил?
2 ответа
Решение
NSTimer предшествует блокам и не был обновлен для их использования. Если вы хотите использовать блок (правильно), используйте источник отправки GCD, т.е. dispatch_source_set_timer
и связанные функции.
В ARC остерегайтесь циклов сохранения (хотя вы должны были бы остерегаться и тех, кто использует NSTimer).
Если вы действительно хотите, вы можете передать блок для селектора, создав категорию. Смотрите этот вопрос. Вы также можете использовать этот проект GitHub для этого.