前一篇完成了点击按钮实现下拉刷新效果,但是还不够。
问题背景:
初次启动APP时,怎么完成下拉刷新呢?
要实现这个功能,真是走了不少弯路。
解决思路:
1、在viewDidLoad里面直接调用refreshTodoList函数
[self refreshTodoList:nil];
这个所最简单容易想到的方法,发现函数虽然调用到了,但是没有下拉效果。
2、模拟点击按钮的功能,来进行自动触发
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 20, 20);
[btn addTarget:self action:@selector(refreshTodoList:) forControlEvents:UIControlEventTouchUpInside];
[btn sendActionsForControlEvents:UIControlEventTouchUpInside];
发现这个的结果和前面的效果一样,问题还是没有解决。
3、在viewWillAppear里面调用refreshTodoList。
-(void)viewWillAppear:(BOOL)animated
{
self.navigationController.navigationBar.tintColor = NAV_BAR_COLOR;
[self refreshTodoList:self];
}
发现这个奏效了,但是第一次进入页面没有出现效果,后面切回到这个页面才会有效果。
于是发现了问题,第一种方法不生效的原因,应该是viewDidLoad后,不能立刻显示后面触发的效果,需要在主进程进行延迟操作,于是修改下代码。也就是第4种。
4、在viewDidLoad里面异步调用refreshTodoList函数
[self performSelector:@selector(refreshTodoList:) withObject:nil afterDelay:0.4];
因为第一种方式中,直接调用实际上所同步执行,跟线程无关,而performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay:<#(NSTimeInterval)#>的方式实际上是异步调用。所以可行。
这个问题可以做实验验证下:
[self performSelector:@selector(refreshTodoList:) withObject:nil afterDelay:0.4]; //异步调用,OK
[self performSelector:@selector(refreshTodoList:) withObject:nil]; //同步调用,不OK
至此,问题解决。