淘客自己的网站怎么做,目前哪个城市又封了,网站建设 价格低,洛宁网站建设金融app相对普通app而言#xff0c;出于安全考虑#xff0c;其安全校验方式比较多#xff0c;以某些银行app为例#xff0c;手机号登录成功后#xff0c;会增加指纹、手势、OCR人脸等验证#xff01;这些安全项的校验#xff0c;会根据用户的风险等级有不同的校验优先级…金融app相对普通app而言出于安全考虑其安全校验方式比较多以某些银行app为例手机号登录成功后会增加指纹、手势、OCR人脸等验证这些安全项的校验会根据用户的风险等级有不同的校验优先级例如A客户的校验顺序是先指纹-手势-OCR,B客户的校验顺序可能是先手势-OCR其验证顺序不固定故此处用责任链的模式来设计更为合理
demo地址https://download.csdn.net/download/denggun12345/88104411?spm1001.2014.3001.5503
//基类BusinessObject
#import Foundation/Foundation.h
#import UIKit/UIKit.h
NS_ASSUME_NONNULL_BEGIN
class BusinessObject;
typedef void(^CompletionBlock)(BOOL handled);
typedef void(^ResultBlock)(BusinessObject *handler, BOOL handled);
interface BusinessObject : NSObject
property (nonatomic,strong) UILabel *LB;
//下一个响应者
property (nonatomic,strong) BusinessObject *nextBusiness;
//响应者的处理方法
-(void)handle:(ResultBlock)result;
//各个业务在该方法当中做时机业务处理
-(void)handleBusiness:(CompletionBlock)completion;
end
NS_ASSUME_NONNULL_END
#import BusinessObject.h implementation BusinessObject
//责任链入口方法
-(void)handle:(ResultBlock)result{ CompletionBlock completion ^(BOOL handled){ //当前业务处理掉了上抛结果 if(handled){ result(self,handled); }else{ //沿着责任链指派给下一个业务处理 if(self.nextBusiness){ [self.nextBusiness handle:result]; }else{ //没有业务处理上抛 result(nil,NO); } } }; //当前业务进行处理 [self handleBusiness:completion];
}
-(void)handleBusiness:(CompletionBlock)completion{ //业务逻辑处理 //如不网络请求、本地照片查询等
}
end
模拟业务类即继承基类的类用来模拟指纹、手势、ocr的业务类
#import BusinessObjectA.h
implementation BusinessObjectA
-(void)handleBusiness:(CompletionBlock)completion{ NSLog(BusinessObjectA); if ([self.LB.text isEqualToString:0]) { completion(YES); }else{ completion(NO); }
}
end #import BusinessObjectB.h
implementation BusinessObjectB
-(void)handleBusiness:(CompletionBlock)completion{ NSLog(BusinessObjectB); if ([self.LB.text isEqualToString:0]) { completion(YES); }else{ completion(NO); }
}
end
#import BusinessObjectC.h
implementation BusinessObjectC
-(void)handleBusiness:(CompletionBlock)completion{ NSLog(BusinessObjectC); if ([self.LB.text isEqualToString:0]) { completion(YES); }else{ completion(NO); }
}
end
//模拟处理逻辑优先级
#import ViewController.h
#import BusinessObjectA.h
#import BusinessObjectB.h
#import BusinessObjectC.h interface ViewController ()
//背景变红色
property (nonatomic,assign) BOOL isOuShu;
property (weak, nonatomic) IBOutlet UILabel *LBOne;
property (weak, nonatomic) IBOutlet UILabel *LBTwo;
property (weak, nonatomic) IBOutlet UILabel *LBThree;
property (nonatomic,strong) NSArray *testArray;
property (weak, nonatomic) IBOutlet UIButton *testBtn; end implementation ViewController
-(NSArray *)testArray{ if(!_testArray){ _testArray [1,2,3]; } return _testArray;
}
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.} - (IBAction)ClickAction:(id)sender { int x arc4random() % 3;//0 1 2 模拟责任链中密码、手势、指纹的优先级 self.LBOne.text [NSString stringWithFormat:%d,x]; self.LBTwo.text [NSString stringWithFormat:%d,x-1]; self.LBThree.text [NSString stringWithFormat:%d,x-2]; //开始责任链 //a指纹 BusinessObjectA *objA [BusinessObjectA new]; objA.LB self.LBOne; [objA handle:^(BusinessObject * _Nonnull handler, BOOL handled) { if(handled){ NSLog(a_yes_handler_test:%,handler.LB.text); [self.testBtn setTitle:LBOne forState:UIControlStateNormal]; }else{ NSLog(a_no_handler_test:%,handler.LB.text); } }]; //b手势 BusinessObjectB *objB [BusinessObjectB new]; objB.LB self.LBTwo; objA.nextBusiness objB; [objB handle:^(BusinessObject * _Nonnull handler, BOOL handled) { if(handled){ NSLog(b_yes_handler_test:%,handler.LB.text); [self.testBtn setTitle:LBTwo forState:UIControlStateNormal]; }else{ NSLog(b_no_handler_test:%,handler.LB.text); } }]; //cOCR BusinessObjectC *objC [BusinessObjectC new]; objC.LB self.LBThree; objB.nextBusiness objC; [objC handle:^(BusinessObject * _Nonnull handler, BOOL handled) { if(handled){ [self.testBtn setTitle:LBThree forState:UIControlStateNormal]; NSLog(c_yes_handler_test:%,handler.LB.text); }else{ NSLog(c_no_handler_test:%,handler.LB.text); } }];
}
end