block使用要注意使用不当,容易出现内存泄漏而崩溃,要注意判空处理,使用时尽量使用弱引用( __weak typeof(self) weakSelf = self;)。
第一种写法
如果下级页面想向上级页面传递一个参数,比如cell像tableview传递
这时候我们就可以用block
首先在cell的.h文件里创建一个block(copy)修饰
//@property (nonatomic, copy) void(^imageBlock)(NSString * idString);
然后在cell的.m文件里就可以使用传值了
// if (self.imageBlock) {
// self.imageBlock();
// }
判断cell的block方法有没有调用,如果调用了就传值具体传什么参数可以在.h里边添加
然后回到上级页面
// cell.imageBlock = ^(NSString * _Nonnull idString) {
//
// }
在上级页面调用block,传值成功。
第二种写法
在需要使用block的.h方法的@interface之上
typedef void(^block的名字)(block需要传的参数,NSString*topicId);
用这种方式去修饰;
在需要使用block的.h方法的@interface之下
@property (nonatomic, copy) block的名字 block; //定义一个block的属性
然后继续第一种方式的操作。
第三种写法控制器传值 block作为参数写入方法
在需要传值的控制器定义block 此处以post请求为例
- (void)POST:(NSString*)urlStr
parameter:(NSDictionary*)parameter
success:(void(^)(idresult))success
failure:(void(^)(NSError*error))failure;
在.m文件实现block方法
- (void)POST:(NSString*)urlStr
parameter:(NSDictionary*)parameter
success:(void(^)(idresult))success
failure:(void(^)(NSError*error))failure
{
AFHTTPSessionManager*manager = [selfAFHTTPSessionManager];
//对url中的中文字符进行转码
NSString *str = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
//POST请求
[managerPOST:strparameters:parameterprogress:^(NSProgress*_NonnulluploadProgress) {
//请求进度
}success:^(NSURLSessionDataTask*_Nonnulltask,id _NullableresponseObject) {
//请求成功回调
NSLog(@"\nAFN网络请求 %@ 拼接参数 %@ \n结果%@", urlStr, parameter, responseObject);
success(responseObject);
}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {
//请求失败回调
NSLog(@"\nAFN网络请求error %@ 拼接参数 %@", urlStr, parameter);
failure(error);
}];
}
Block传值,在需要取值的控制器实例化存储有block的类
例如
(属性使用减号方法,类名调用 用加好方法)
APIManager * api = [APIManager shared];
[api POST:<#(NSString *)#> parameter:(NSDictionary *) success:^(idresult) {
<#code#>回调回来的值
} failure:^(NSError *error) {
<#code#>
}];
学浅,欢迎大屌指正~~