block的几种使用方式(学习中)

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#>

    }];

学浅,欢迎大屌指正~~

你可能感兴趣的:(block的几种使用方式(学习中))