解决方法
我正在添加一个新的答案,因为唯一的解释不是很精确.这可能是太多的评论.
调用 – [NSObject(NSDelayedPerforming)performSelector:withObject:afterDelay:]保证在下一个循环迭代中执行调用.
所以这不行,因为有一个小的延迟,但你正在移动到下一个循环.
实际上你可以将延迟减少到0.0,它仍然可以工作.而且,一个更正确的(在使用该对象意味着实现某事,而不是更好的结果)实现是可能的.
以下是各种代码片段:
// SOLUTION I [[self tableView] reloadData]; [[self refreshControl] performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.0]; // SOLUTION II (semantically correct) [[self tableView] reloadData]; [[NSOperationQueue currentQueue] addOperationWithBlock:^{ [[self refreshControl] endRefreshing]; }]; // SOLUTION III (GCD) dispatch_async(dispatch_get_main_queue(),^{ [[self refreshControl] endRefreshing]; }];
编辑
正如johann-fradj指出的,你也可以使用GCD.我喜欢GCD很多,但我认为,解决方案II对于发生了什么是最具描述性的.而且,GCD并不是非常客观的C-ish,所以我个人更喜欢坚持我的解决方案.