OC: Block回调的使用demo
Block 的用法
对于类的继承问题,子类在实现的时候,一般是自下而上,先看看下面的实现没有,没实现就向上找方法去实现。
// // main.m #import <Foundation/Foundation.h> #import "LoginMangage.h" #import "NSString+Addition.h" //2 block的当做方法进行传值 //3 一种Block排序的写法(貌似还是以前的方法哦) //4 用结构体(-1 0 1) NSComparisonResult 类型接收判断结果 //5 打印出当前时区的时间(不是格林威治时间哦) //6 练习-打印出当前时区的时间 //7 dateWithTimeIntervalSinceNow:的使用 //8 (来自互联网-究竟是不是毫秒)获取自1970年以来的毫秒数的方法 ?????? //9 两个时间判断是否相等 获取时间间隔 //10 catergroy 对 NSString 类的方法的扩展 int main(int argc, const char * argv[]) { // @autoreleasepool { // //// // 1.定义一个Block,返回值为bool,有两个NSString 实现判断两个字符串是否相等。 // // // // 2.创建一个数组,初始化为@“123”,@“21”,@“33”,@“69”,@“108”,@“256”使用Block,进行数组排序,并输出内容 // // // // 3.定义一个Block,返回值为NSInteger ,有两个参数,一个是NSArray 一个是NSString,实现判断数组时候包含此字符串,如果包含,返回字符串下标,如果不包含返回-1. // //(1) // printf("输入两个字符串\n"); // char str[2][10] = {0}; // NSMutableArray * arr = [NSMutableArray array]; // for (int i = 0; i < 2; i++) { // scanf("%s",str[i]); // NSString * str0 = [[NSString alloc]init]; // NSString * str1 = [NSString stringWithUTF8String:str[i]]; // arr[i] = [str0 stringByAppendingString:str1]; // } // BOOL (^compareWithTwoNString)(NSString *,NSString *) = ^(NSString *s0,NSString *s1){ // return [s0 isEqualToString:s1]; // }; // int isEqual = compareWithTwoNString(arr[0],arr[1]); // if (isEqual) { // NSLog(@"两次输入相等"); // }else{ // NSLog(@"两次输入不相等"); // } // //(2) // NSMutableArray * muArr = [@[@"123",@"21",@"69",@"33",@"108",@"256"]mutableCopy]; // [muArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { // return [obj1 compare:obj2]; // }]; // NSLog(@"排序之后为 %@",muArr); // //(3) // NSInteger(^isInIt)(NSArray *,NSString *) = ^(NSArray * arr,NSString * str){ // NSInteger tem = 0; // for (int i = 0; i < [arr count]; i++) { // if ([arr[i] isEqualToString:str]) { // tem++; // NSLog(@"已经找到了"); // return tem ; // break; // } // } // NSLog(@"没有找到"); // tem = -1; // return tem;//注意这里的 return 的位置 // }; // NSArray * arrary = @[@"lu",@"zhang",@"huang ",@"li ",@"zhao",@"wang",@"qian"]; // NSInteger afterFind = isInIt(arrary,@"wang"); // NSLog(@"下标为%ld",afterFind); // } // @autoreleasepool { // //2 block的当做方法进行传值 // LoginMangage * login1 = [[LoginMangage alloc]init]; // [login1 initWithName:@"user" paswword:@"123456" succe:^(NSString *success) { // NSLog(@"%@",success); // } failure:^BOOL(NSString *errorMessage) { // NSLog(@"%@",errorMessage); // return 1; // }]; // } // @autoreleasepool { // //3 一种Block排序的写法(貌似还是以前的方法哦) // NSArray * stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil]; // NSComparator sortBlock = ^(id string1 ,id string2){//貌似这里开始的三行代码没有什么作用 // return [string1 compare:string2]; // }; // NSArray * sortArray = [stringArray sortedArrayUsingSelector:@selector(compare:)]; // NSLog(@"排序后的为:%@",sortArray); // } // @autoreleasepool { // //4 用结构体(-1 0 1) NSComparisonResult 类型接收判断结果 // NSString * str1 = @"123"; // NSString * str2 = @"456"; // NSComparisonResult(^compareStrings)(NSString *,NSString *) = ^(NSString * string1 ,NSString * string2){ // return [string1 compare:string2]; // }; // NSComparisonResult resu = compareStrings(str1,str2); // if (resu == 1) { // NSLog(@"str1小于str2"); // } // if (resu == -1) { // NSLog(@"str1大于str2"); // } // if (resu == 0) { // NSLog(@"str1等于str2"); // } // } // @autoreleasepool { // //5 打印出当前时区的时间(不是格林威治时间哦) // NSDate * datenow = [NSDate date];//注意这里不能写成了 NSData //// NSLog(@"%@",datenow);//没有修改时间显示格式的的时候打印结果 // NSString * datestring = @"yyyy年 MMM d 日 是一年的第 D 天 EEEE ahh:MM:SS"; // NSDateFormatter * formatter = [[NSDateFormatter alloc]init]; // [formatter setDateFormat:datestring]; // NSString * strdate = [formatter stringFromDate:datenow]; // NSLog(@"获取当前时间为:%@",strdate); // //互联网 // //时区转换,取得系统时区,取得格林威治时间差秒 // //(http://www.isaced.com/post-175.html) 已经实现在控制台的转化为当前时区 // NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone]secondsFromGMT]; // NSLog(@"%f",timeZoneOffset/60.0/60.0); // datenow = [datenow dateByAddingTimeInterval:timeZoneOffset]; // [formatter setDateFormat:@"现在日期:yyyy年MM月dd日\n现在时刻:aHH:mm:ss"]; // NSDate * dtime = [NSDate date]; // NSString * newDateStr = [formatter stringFromDate:dtime]; // NSLog(@"%@",newDateStr); // } // @autoreleasepool { // //6 练习-打印出当前时区的时间 // NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone]secondsFromGMT]; // NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init]; // [dateFormatter setDateFormat:@"\n现在日期:yyyy年 MM月 d 日 EEEE\n 现在时间:aHH:mm:ss "]; // NSDate * dateNow = [NSDate date]; // dateNow = [dateNow dateByAddingTimeInterval:timeZoneOffset]; // NSString * afterTrDate = [dateFormatter stringFromDate:dateNow]; // NSLog(@"当前时间:%@",afterTrDate); // } // @autoreleasepool { // //7 dateWithTimeIntervalSinceNow:的使用 // NSDate * dateNow = [NSDate date]; // NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone]secondsFromGMT]; // [dateNow dateByAddingTimeInterval:timeZoneOffset]; // NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init]; // [dateFormatter setDateFormat:@"日期:yyyy年 MM 月 dd 日 EEEE\n时间:aHH:mm:ss"]; // NSString * afterDate = [dateFormatter stringFromDate:dateNow]; // NSLog(@"\nnowtime = %@",afterDate); // //获取到现在一段时间间隔的日期 // NSDate * tomorrowDate = [NSDate dateWithTimeIntervalSinceNow:24*60*60]; // NSString * afterDaterTomro = [dateFormatter stringFromDate:tomorrowDate]; // NSDate * yestredayDate = [NSDate dateWithTimeIntervalSinceNow:-24*60*60]; // NSString * afterDateYesday = [dateFormatter stringFromDate:yestredayDate]; // NSLog(@"\ntomorrowdate = %@\nyesterday = %@ ",afterDaterTomro,afterDateYesday); // } // @autoreleasepool { // //8 (来自互联网-究竟是不是毫秒)获取自1970年以来的毫秒数的方法 ?????? // NSDate * dateNow = [NSDate date]; // NSTimeInterval time = [[NSDate date] timeIntervalSince1970]; // // NSTimeInterval返回的是double类型,输出会显示为10位整数加小数点加一些其他值 // // 如果想转成int型,必须转成long long型才够大。 // // 将double转为long long型 // long long dTime = [[NSNumber numberWithDouble:time]longLongValue]; // // 输出long long型 // NSString * curTime = [NSString stringWithFormat:@"%llu",dTime]; // NSLog(@"%@",curTime); // } // // @autoreleasepool { // //9 两个时间判断是否相等 获取时间间隔 // NSDate * dateNow = [NSDate date];//获取当前时间 // NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone]secondsFromGMT];//获取与格林威治时区的时差秒 // [dateNow dateByAddingTimeInterval:timeZoneOffset];//格林威治时区加上时差 // NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];//时间格式设置器 // [dateFormatter setDateFormat:@"日期:yyyy年 MM 月 dd 日 EEEE 时间:aHH:mm:ss"];//注意这里的时间设置格式不能写错啦 // NSString * afterTime = [dateFormatter stringFromDate:dateNow]; // NSLog(@"%@",afterTime); // NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-24*60*60]; // NSTimeInterval timeInterval = [dateNow timeIntervalSinceDate:yesterday]; // NSLog(@"%.f",timeInterval/24/60/60); // NSTimeInterval timeInterval1970 = [yesterday timeIntervalSince1970]; // NSLog(@"1970年到现在的秒数为%.f",timeInterval1970); // //比较两个时间(返回一个枚举值)默认为升序 // NSComparisonResult result = [dateNow compare:yesterday]; // if (result != 0) { // NSLog(@"NSComparisonResult接收的结果是两个时间段不相等"); // } // BOOL isEqual = [dateNow isEqualToDate:yesterday]; // if (isEqual) { // NSLog(@"两个日期相等"); // }else{ // NSLog(@"两个日期不相等"); // // } // } // @autoreleasepool { // //10 catergroy 对 NSString 类的方法的扩展 // NSString * str = @"HHH"; // [str sayHi]; // //只能添加方法 // //为 NSString 扩充方法 :获取字符串的首字母并大写 // NSString * oneString = [str getFirstCharacter]; // NSLog(@"获取的首字母为:%@",oneString); // NSString * newStr = [str change]; // NSLog(@"%@",newStr); // NSInteger num = 13523526302; // NSString * newstrnum = [[NSString alloc]init]; // newStr = [str transToString:num];//把 NSInteger 型数字转化为 字符串数字 // NSLog(@"%@",newStr); // NSInteger nsnum = [newStr stringToValue];//把字符串数字转化为 NSInteger 型数字 // NSLog(@"%ld",nsnum); // } return 0; }
// // NSString+Addition.h #import <Foundation/Foundation.h> @interface NSString (Addition)//这就是一个 NSString 类的 category(类方法的扩展) -(void)sayHi; //获取字符串的首字母并以大写的形式 - (NSString *)getFirstCharacter; //把对应的字符串日期转化为特定的形式@"20150819"--@"2015.08.19" - (NSString *)change; //把基本整型转化为字符串类型 - (NSString *)transToString:(NSInteger)num; //把字符串转化为基本的整型 - (NSInteger)stringToValue; @end
// // NSString+Addition.m //NSString+Addition.h" @implementation NSString (Addition) -(void)sayHi{ NSLog(@"我是一个分类方法哦"); } //获取字符串的首字母并以大写的形式 - (NSString *)getFirstCharacter{ // return [[self substringToIndex:1]uppercaseString]; return [[self substringToIndex:1]capitalizedString]; } //把对应的字符串日期转化为特定的形式@"20150819"--@"2015.08.19" - (NSString *)change{ // NSDateFormatter * dateFormantter = [[NSDateFormatter alloc]init]; // [dateFormantter setDateFormat:@"日期: yyyy年 MM月 dd日 EEEE 时间:aHH:mm:ss"]; NSMutableString * newString = [NSMutableString stringWithString:self]; if ([self length] < 8) { NSLog(@"长度不够"); }else{ // [str substringToIndex:4];//这是截取字符串的方法,这里搞混了,这里要插入 // [str substringToIndex:7]; NSString * str = @"."; [newString insertString:str atIndex:4]; [newString insertString:str atIndex:7]; } return newString; } //把基本整型转化为字符串类型 - (NSString *)transToString:(NSInteger)num{ NSString * newstr = [NSString stringWithFormat:@"%ld",num]; return newstr; } //把字符串转化为基本的整型 - (NSInteger)stringToValue{ return [self integerValue]; } @end
// // LoginMangage.h // 08-22Am // #import <Foundation/Foundation.h> typedef void(^mysuccessblock) (NSString * accuntName); typedef BOOL(^myfailureblock) (NSString * failure); @interface LoginMangage : NSObject -(void)initWithName:(NSString *)name paswword:(NSString *)password succe:(mysuccessblock)succes failure:(myfailureblock)errorMessage; @end
// // LoginMangage.m //LoginMangage.h" @implementation LoginMangage -(void)initWithName:(NSString *)name paswword:(NSString *)password succe:(mysuccessblock)succes failure:(myfailureblock)errorMessage{ if (name == @"user" && password == @"123456") { succes(@"登陆成功"); }else{ BOOL result = errorMessage(@"账户名或密码错误"); if (result) { NSLog(@"错误已经处理"); errorMessage(@"请重置密码"); }else{ NSLog(@"没有处理错误"); errorMessage(@"请联系管理员"); } } } @end
// // main.m #import <Foundation/Foundation.h> #import "Person.h" #import "DownLoadManager.h" #import "LoginManage.h" // int maxValue(int,int); int maxValue(int a, int b){ return a > b ? a:b; } //2 Block变量的访问 int opennum = 10000; //3 //4 简单的字符串拼接 //5 使用Block对字符串进行比较(NSComparisonResult) //6 简单的Block 判断两个数字的大小 //7 对人的一些信息进行排序 //8 block的传值,与回调传值 int main(int argc, const char * argv[]) { // @autoreleasepool { // // insert code here... // NSLog(@"Hello, World!"); // //函数指针 // int (*p)(int,int) = maxValue; // int max = p(12,48); // NSLog(@"max = %d",max); // //block 语句块 // int (^ minOfTwo)(int,int) = ^(int a, int b){ // return a < b ? a : b; // }; // int minoftwo = minOfTwo(45,4); // NSLog(@"min = %d",minoftwo); // } // @autoreleasepool { // // 2 Block变量的访问 // __block int number = 20; // void (^myblock)(int) = ^(int a){ // NSLog(@"用_block修饰的实例变量为%d",a); // number = 100; // NSLog(@"修改了Block外部定义的可在Block内被修改的数%d",number); // opennum += 1; // NSLog(@"全局变量无需用__block修饰就可以在这里被修改为%d",opennum); // }; // myblock(number); // } // @autoreleasepool { //3 Block 拼接字符串 // NSArray * strArr = @[@"Hello",@"UUUU",@"39"]; // NSString *(^appendString)(NSArray *) = ^(NSArray * arr){ // NSString * newstr = @""; // for (int i = 0; i < [arr count]; i++) { // NSString * append = arr[i]; // newstr = [newstr stringByAppendingString:append]; // } // return newstr; // }; // NSString * strarry = appendString(strArr); // NSLog(@"拼接之后为:%@",strarry); // } // @autoreleasepool { // //4简单的字符串拼接 // NSArray * arr = @[@"Hello",@"IIIII",@"39"]; // NSString * newstr = [[NSString alloc]init]; // NSString * newArr = [[NSString alloc]init]; // for (int i = 0; i < [arr count]; i++) { // newstr = arr[i]; // newArr = [newArr stringByAppendingString:newstr]; // } // NSLog(@"%@",newArr); // } // // @autoreleasepool { // //5 使用Block对字符串进行比较(NSComparisonResult) // NSComparisonResult (^compareString)(NSString * , NSString *) = ^(NSString * arr1,NSString *arr2){ // NSComparisonResult result = [arr1 compare:arr2]; // if (result == NSOrderedSame) { // NSLog(@"arr1与 arr2 相等"); // } // if (result == NSOrderedAscending) { // NSLog(@"arr1 小于 arr2"); // } // if (result == NSOrderedDescending) { // NSLog(@"arr1 大于 arr2"); // } // return result; // }; // NSString * arr1 = @"HHHH"; // NSString * arr2 = @"HHH"; // compareString(arr1,arr2); // } // @autoreleasepool { // //6 简单的Block 判断两个数字的大小 // void (^ compareTwoNum)(int a,int b) = ^(int a ,int b){ // if (a > b) { // NSLog(@"第一个数大于第二个数"); // } // if (a < b) { // NSLog(@"第一个数小于第二个数"); // } // if (a == b) { // NSLog(@"两个数字相等"); // } // }; // compareTwoNum(12,78); // // //Block判断两个NSInteger的类型数字的大小(主义先进行转化为 NSNumber 类型数字) // NSComparisonResult (^compareNsinterger)(NSInteger ,NSInteger) = ^(NSInteger a, NSInteger b){ // NSNumber * object1 = [NSNumber numberWithInteger:a]; // NSNumber * object2 = [NSNumber numberWithInteger:b]; // NSComparisonResult result = [object1 compare:object2]; //// NSNumber * obj1 = @(a); //// NSNumber * obj2 = @(b); // return result; // }; // NSComparisonResult comresult = compareNsinterger(45,78); // // //不可变数组的排序 // NSArray * arr = [NSArray arrayWithObjects:@"hellow", @"TTTTTT", @"39", @"HHHH", @"WWWW", nil]; //// NSMutableArray * mutArr = [NSMutableArray arrayWithArray:arr]; // NSArray * newArray = [arr sortedArrayUsingSelector:@selector(compare:)]; // NSLog(@"默认的升序排列之后为:%@",newArray); // NSArray * newarr = [arr sortedArrayWithOptions:(NSSortOptions)1 usingComparator:^NSComparisonResult(id obj1, id obj2) { // return [obj1 compare:obj2]; // }]; // NSLog(@"%@",newarr); // // //可变数组的排序 //// NSArray * arr = [NSArray arrayWithObjects:@"hellow", @"JJJJJ", @"39", @"HHH", @"XXXX", nil]; // NSMutableArray * mutArr = [NSMutableArray arrayWithArray:arr];//这里把上面的arr转化为一个可变数组并重新为可变数组开辟空间 // NSMutableArray * mu2arr = [@[@"4",@"3",@"1",@"2"]mutableCopy];//将不可变数组转化为可变数组的mutableCopy方法 // [mutArr sortedArrayUsingSelector:@selector(compare:)];//返回一个排好序的数组 // [mu2arr sortUsingSelector:@selector(compare:)]; // NSLog(@"%@",mutArr); // NSLog(@"%@",mu2arr); //// 使用Block可以改变排序的模式 // [mu2arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { // return -[obj1 compare:obj2];//很奇怪上面的两次排序不注释掉的话,这里不能实现降序排序???????是因为这里需要有一个 NSArray 的变量去接收一下就对了 // }]; // NSLog(@"%@",mu2arr); // } // @autoreleasepool { // //7 对人的一些信息进行排序 // Person *per1 = [[Person alloc]initWithName:@"KKKKK" age:23 heigeht:1.78]; // Person *per2 = [[Person alloc]initWithName:@"hangtian" age:30 heigeht:1.86]; // Person *per3 = [[Person alloc]initWithName:@"liucuihua" age:34 heigeht:1.72]; // Person *per4 = [[Person alloc]initWithName:@"zhangfeng" age:27 heigeht:1.68]; // Person *per5 = [[Person alloc]initWithName:@"huangjunwei" age:25 heigeht:1.64]; // Person *per6 = [[Person alloc]initWithName:@"zahnghong" age:19 heigeht:1.78]; // Person *per7 = [[Person alloc]initWithName:@"shixiaofei" age:18 heigeht:1.70]; // Person *per8 = [[Person alloc]initWithName:@"liusi" age:24 heigeht:1.75]; // NSArray * perArr = [NSArray arrayWithObjects:per1,per2,per3,per4,per5,per6,per7,per8, nil]; //// NSArray * newPerArr = [perArr sortedArrayUsingSelector:@selector(compare:)];//方法一 // NSArray * newPerArr = [perArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { //// return [[obj1 name] compare:[obj2 name]];//name升序排序 //// return [@([obj1 age]) compare:@([obj2 age]) ];//按照年龄升序排序 //// return [@([obj1 height])compare:@([obj2 height])];//按照升高升序排序 // return [@([obj2 age]) compare:@([obj1 age])]; // }]; // NSLog(@"按年龄降序排序后为:%@",newPerArr); // } // @autoreleasepool { // //8 block的传值,与回调传值 // DownLoadManager * down = [[DownLoadManager alloc]init]; // [down download:^int(int n) { // NSLog(@"得到数字:%d",n); // return 45;//这里想用回调返回数字 // }]; // LoginManage * login = [[LoginManage alloc]init]; // [login loginWithname:@"user" password:@"123456" success:^(NSString *accountName) { // NSLog(@"%@",accountName); // } failure:^BOOL(NSString *errorMessage) { // NSLog(@"%@",errorMessage); // return 0; // NSLog(@"%@",errorMessage); // }]; // } return 0; }
// #import <Foundation/Foundation.h> @interface Person : NSObject { NSString *_name; NSInteger _age; CGFloat _height; } //@property NSString * address; -(void)setName:(NSString *)name; -(NSString *)name; -(void)setAge:(NSInteger)age; -(NSInteger)age; -(void)setHeight:(CGFloat)_height; -(CGFloat)height; //初始化 -(id)initWithName:(NSString *)name age:(NSInteger)age heigeht:(CGFloat)height; //便利构造器 +(Person *)personWithName:(NSString *)name age:(NSInteger)age height:(CGFloat)height; -(NSString *)description; @end
// // Person.m #import "Person.h" @implementation Person -(void)setName:(NSString *)name{ _name = name; } -(NSString *)name{ return _name; } -(void)setAge:(NSInteger)age{ _age = age; } -(NSInteger)age{ return _age; } -(void)setHeight:(CGFloat)height{ _height = height; } -(CGFloat)height{ return _height; } //初始化 -(id)initWithName:(NSString *)name age:(NSInteger)age heigeht:(CGFloat)height{ self = [self init]; if (self) { _name = name; _age = age; _height = height; } return self; } //便利构造器 +(Person *)personWithName:(NSString *)name age:(NSInteger)age height:(CGFloat)height{ Person * per = [[Person alloc]initWithName:name age:age heigeht:height]; return per; } -(NSString *)description{ return [NSString stringWithFormat:@"name:%@ age:%ld height:%.2f",_name,_age,_height]; } @end
// // #import <Foundation/Foundation.h> typedef int (^myBlock) (int n); typedef void (^myBlock1) (int n,int b); @interface DownLoadManager : NSObject -(int)download:(myBlock)block; -(void)chuanzhi:(myBlock1)block1; @end
// // DownLoadManager.m // #import "DownLoadManager.h" @implementation DownLoadManager -(int)download:(myBlock)block{ NSLog(@"已经传值"); return block(100); } -(void)chuanzhi:(myBlock1)block1{ } @end
// // LoginManage.h // #import <Foundation/Foundation.h> typedef void(^successfulBlock) (NSString *accountName); typedef BOOL(^failureBlook) (NSString *errorMessage); @interface LoginManage : NSObject -(void)loginWithname:(NSString *)name password:(NSString *)password success:(successfulBlock)success failure:(failureBlook)failure; @end
// // LoginManage.m // #import "LoginManage.h" @implementation LoginManage -(void)loginWithname:(NSString *)name password:(NSString *)password success:(successfulBlock)success failure:(failureBlook)failure{ if ([name isEqualToString:@"user"] && [password isEqualToString:@"123456"]) { NSLog(@"登陆成功"); success(name); } else{ BOOL result = failure(@"账户或密码错误"); if (result) { NSLog(@"错误已经处理"); failure(@"请你重设登录密码"); } else{ NSLog(@"错误没有处理"); NSLog(@"请尽快联系管理员重置密码"); } } } @end