Поскольку вы запускаете селектор function:
в другом потоке, [NSRunLoop currentRunLoop]
отличается от основного потока.
См. Ссылка NSRunLoop :
Если к циклу выполнения не подключены источники входного сигнала или таймеры, этот метод завершается немедленно
Я полагаю, что ваш цикл выполнения пуст, и поэтому журналы «ДО» и «ПОСЛЕ» появятся мгновенно.
Простым решением вашей проблемы будет
@implementation myObject
-(void)function:(id)param
{
NSLog(@"BEFORE");
[[NSRunLoop currentRunLoop] addTimer:[NSTimer timerWithTimeInterval:20 selector:... repeats:NO] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
NSLog(@"AFTER");
}
@end
В действительности вы, вероятно, поместили бы код, который записывает «AFTER», в новый метод, который вызывается вашим таймером. В общем случае вам не нужны потоки для создания анимации (если вы не делаете что-то вычислительно дорогое). Если вы занимаетесь вычислительно дорогими вещами, вам также следует рассмотреть возможность использования Grand Central Dispatch (GCD), которая упрощает расчеты разгрузки в фоновых потоках и будет выполнять сантехнику за вас.