最近项目中遇到的问题和实际的解决方案的分享,还有一款小插件的分享,希望对遇到同类问题的作者有所帮助。
问题一
使用WebView
加载网页时候进行加载时候,如果出现网络请求缓慢,并且使用MBProgressHub
进行动画处理,会出现以下情形:
情形一:使用[MBProgressHub showMessage:""]
- 使用这个方法你会出现这个情况
这样的话用户无法操作,只能杀死程序重新开启程序,用户体验极差
情形二:使用[MBProgressHub showMessage:@"" toView:self.view]
-
这样体验较情形一较好,用户可以使用返回键返回,体验也不是很好
针对这个问题首先想到的是WebView
有没有个属性可以提供我设置超时请求,找了一遍没有,那么WebView
load 是一个request
,那么肯定有设置请求超时的操作,果然发现以下方法
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:_webViewUrl] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0];
在webView
的代理方法中
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
NSLog(@"%@",error.userInfo);
[MBProgressHUD hideHudWithMessageError:error.userInfo[@"NSLocalizedDescription"]];
[MBProgressHUD hideHUDForView:_webView];
}
这样的就处理webView
中的超时请求
问题二
定时器NSTimer
使用出现的问题:在做获取验证码操作时候倒计时出现负数,原因未能正确处理定时器造成。
-(void)setUpTimer
{
self.timeLable.text = @"119s";
self.sendBtn.hidden = YES;
self.timeLable.hidden = NO;
self.timeIndex = 119;
//设置定时器
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(elapsedTimer) userInfo:nil repeats:YES];
//这句代码非常重要,否则会造成未知的错误
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
}
//执行倒数器
-(void)elapsedTimer
{
self.timeIndex = self.timeIndex - 1;
if (self.timeIndex < 0) {
self.timeLable.hidden = YES;
self.sendBtn.hidden = NO;
[self timerEndRunning];
}else
{
self.timeLable.text =[NSString stringWithFormat:@"%ds",self.timeIndex];
}
}
// 结束倒数器
- (void)timerEndRunning
{
if (self.timer != nil) {
[self.timer invalidate];
self.timer = nil;
}
}
在处理发送验证码按钮发送后显示暗色有两种方法,第一种将按钮设置为不能点击然后将按钮的背景色设置为灰色,第二种是创建按钮的时候设置图片的UIControlStateDisabled
下的图片,以上两种的都可以。
你以为上面定时器就处理完成了吗?当你销毁界面的时候,你会发现delloc
并未调用,实际上当控制器出栈的时候,并未销毁,什么原因呢,原因是你在发送验证码倒计时过程的定时器并未销毁和停止!!!
所以正确的逻辑应该是:
- (void)viewDidDisappear
{
if(self.timer != nil)
[self.timer valide];
self.timer = nil;
}
记得一定先valide
再nil。
问题三
给大家分享一个模拟低网速的插件,其实苹果官方已经给我们提供了这样的插件,我们去苹果官网下载就可以了
具体地址见下图:
这个地址是需要账号登录的,没有的伙伴申请一个即可。
点开后
这样就可以在模拟器上模拟相应的网络状态了。再不用担心,做项目的时候遇到关于网络的测试了。