Каков правильный способ установки текущего потока NSRunLoop для запуска в определенном режиме, пока я не решит его остановить?

Я хочу подражать поведению UIScrollView, когда текущий режим RunLoop потока изменяется на UITrackingRunLoopMode при перетаскивании scrollView и обратно в NSDefaultRunLoopMode, когда вы перестаете перетаскивать.

Я хочу сделать это со своим собственным классом, хотя, перетаскивая просмотры... Сейчас я использую этот код

while (_draggingView && [[NSRunLoop currentRunLoop] runMode:UITrackingRunLoopMode beforeDate:[NSDate distantFuture]]);

Когда я перестаю перетаскивать, _draggingView изменяется на нуль, поэтому я останавливаю цикл в этом режиме. Есть ли более элегантный/лучший способ сделать это?

Как работает UIScrollView? Входные источники?

Спасибо

Ответ 1

Вы можете использовать CFRunLoopStop, чтобы вернуть цикл выполнения.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    CFRunLoopStop(CFRunLoopGetMain());
}

Ответ 2

Вы можете использовать замедленные методы.

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

После перетаскивания прокрутки он начинает замедляться, поэтому эти методы могут вам пригодиться.