最近在一个项目中遇到了一个流程控制问题。
app在启动过程中需要先去验证网络,网络验证通过了。再去请求一个秘钥。请求秘钥之后再去验证服务器的配置版本和当地的版本是否一致。这么说可能很多人会蒙圈了。其实说白了就是app启动的时候需要做三次网络请求且有一定的顺序。但是各个接口的速度和当时的网络情况等等。如果不加控制。有可能几件事情的顺序乱掉。而且要求一个进度卡住了 需要重新走下该流程。即如果秘钥没有拿到。那么需要重新检查网络。再次获取秘钥和app版本验证。
上代码
先创建函数主体,
- (id)startWithDelegate{
//第一步:检查网络
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
[self checkNetWork];
}];
//第二步:获取key
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
[self getKeyForServer];
}];
//第三步:检测服务器版本
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
[self checkVersionFromServer];
}];
//设置依赖
[operation2 addDependency:operation1]; //任务二依赖任务一
[operation3 addDependency:operation2]; //任务三依赖任务二
//创建队列
_queue= [[NSOperationQueue alloc] init];
[_queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];
return nil;
}
建立三个任务建立依赖关系。 这样并不能完全控制几个任务的流程。还需要借助信号量。
信号量的问题不懂得请自行百度去。
//检查网络是否通畅
- (BOOL )checkNetWork{
//创建信号量并设置计数默认为0
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_main_queue(), ^{
BOOL isConnect = [AD isConnectionAvailable];
if (isConnect) {
//通过了网络验证 通知信号量继续执行下边的功能
dispatch_semaphore_signal(sema);// 这行之行完毕才return结果。
}else{
//网络验证出现问题。弹出对话框。
[self showMessage:@"当前网络异常,请检查你的网络" tag:1];
}
//若计数为0则一直等待
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
return isConnect;
}
在弹出信息的代理中 处理队列中的任务。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (alertView.tag == 1) {
if (_queue) {
[_queue cancelAllOperations];
}
[[DNEBridgeHelper sharedInstance] startWithDelegate];
}
}
代码如上。自行体会去吧。
本文参考
http://www.jianshu.com/p/342b2ffbdd97
网友评论