刚入门iOS,感觉block语法好神奇,是如何把函数的局部变量共享到外部函数以及全局变量呢?
实战情景
现在有个情景,是请求网络成功后把成功或者失败的结果回调给外部,外部收到请求的结果进行相应的处理。
现在创建一个NetWork类,为外界面提供一个方法:请求数据结果回调。如下面一端代码
#import <Foundation/Foundation.h>
@interface NetWork : NSObject
//请求数据
- (void)requestDataComplete:(void(^)(BOOL success,id obj))complete;
@end
第二步,在NetWork类中定义一个私有的属性变量 ,保存外界调用的block变量。如下:
@interface NetWork()
@property (nonatomic,copy)void(^complete)(BOOL success,id obj);//私有变量,保存外界调用的block变量
@end
第三步,请求完成,回调数据给外界。
e.g:self.complete(YES,@”请求成功”); //以这种方式回调。
//模拟请求数据 2秒后请求成功
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//模拟结果一:成功回调字符串
self.complete(YES, @"请求成功");
// //模拟结果二:成功回调NSData
// NSData *dataSuccess = [NSData new];
// self.complete(YES, dataSuccess);
// //模拟结果三:失败回调字符串
// self.complete(NO, @"请求失败");
// //模拟结果四:失败回调NSData
// NSData *dataError = [NSData new];
// self.complete(NO, dataError);
});
第四步,外界如何实现。
在ViewController中,
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NetWork alloc] requestDataComplete:^(BOOL success, id obj) {
if (success) {
NSLog(@"请求成功,回调数据:%@",obj);
}else{
NSLog(@"请求失败,回调数据:%@",obj);
}
}];
}
block变量的写法原来如此简单。。。
喜欢的欢迎点赞支持,你的支持,我的动力!