I have a UITableViewController
with its default UITableView
. I begin slowly dragging the table with my finger to scroll, i.e. not flicking it with my finger. Every time the table moves on-screen the scrollViewDidScroll
method of the controller is called; when some conditions I've specified are met, one of these calls to scrollViewDidScroll
uses performSelector:withObject:afterDelay
to schedule some action at a later time.
However, I'm finding that the action will not execute until I release my finger. For example, if I set the afterDelay
parameter to 2 seconds, but hold my finger for 5 seconds, when I release my finger and the action executes it's 3 secon开发者_StackOverflowds too late. Is there any way to allow the action (which is to update the UI and so must run in the main thread) to execute while the finger is still against the screen?
Thanks!
This is because when a UIScrollView
(UITableView's superclass) is scrolling, it changes its runloop in order to prioritize the scrollView over whatever the application was doing. This is happening to make sure scrolling is as smooth as it can be.
try using this version of delayed method:
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;
for the modes, I'd suggest starting with an array that contains the following:
[[NSRunloop currentRunLoop] currentMode]
,
NSDefaultRunLoopMode
精彩评论