iOS项目内block的使用小结(1)

来源:互联网 发布:泉立方洗衣片 知乎 编辑:程序博客网 时间:2024/05/29 18:20

单位项目中block用的非常普遍,导致我这种一瓶子不满半瓶子晃荡的选手很是忧伤,这几天研究这个感觉有了点收获,赶紧记下来,怕到时忘了,给自己留个印象。
block其实就是一段代码块,一个函数,一个方法的封装,像网上举的初学的那种例子一堆就不介绍了,项目里主要用到了两种,一个是传值,写法就是Aviewcontroller push到Bviewcontroller中的时候,在Bviewcontroller中比如我选择了一个城市,然后选择完毕就自动返回到Aviewcontroller,然后A中有一个label。本来没跳转之前是默认的显示:@“请选择城市”,在跳转目标Bviewcontroller中定义一个block
void(^Myblock)(nsstring *city);
定义成属性
@property (nonatomic, unsafe_unretained) Myblock myblock;
在B中比如我点击了“北京”这个tableview的cell,那么我就获取一下北京这个nsstring,在cell的didselect事件里 写上
nsstring *cityStr = @“北京”;
myblock(cityStr);
【self poptoviewcontroller……xxx】;
在Aviewcontroller中跳转处定义B的对象
Bviewcontroller *b = 【Bviewcontroller new】;拿到B的block
b.block = ^(nsstring *city){
self.citylabel.text = city;
}
大体就是这样子,手写的,不贴代码了,能看懂就行,
以上是第一种应用。
第二种我用的不多,但是感觉特别普遍,对我来说还挺难理解的。
比如我写一个网络请求:

+(void)httpPost:(NSString *)evt params:(id)params cb:(Callback)cb{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@”text/html”, @”application/json”, @”text/plain”, nil];
[manager POST:evt parameters:@”” progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (responseObject) {
cb(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (error) {
NSLog(@”错误%@”,[error description]);
}
}];
}
上面的cbblock 是我自己定义的一个,里面有一个id类型的参数。在请求数据得到response的时候,我对这个response进行了cb(responseObject)的处理,是什么意思呢?我来详细说一下。
我在外面调用的时候,可以直接调用这个httpPost:方法,类似我在Bviewcontroller中调用这个网络请求,写成这种:
[A httpPost:@“baidu.com” params:nil cb:^(id responseObj) {
nsdictionary *dic = [responseObject mj_jsonObject];
dispatch_async(dispatch_get_main_queue(), ^{
NSString *status = dic[@”s”];
NSDictionary *jsonData = dic[@”d”];
NSLog(@”status:%@ data:%@”,status,jsonData);
});
}];];
可以看到,我在拿到了responseObject之后,对他进行了mj_extension的类型转换,转成了字典,然后打印了一下。这是在拿到response之后进行的操作,那么我在上面网络请求的方法中cb(response)是什么意思呢?意思就是我在Bviewcontroller中调用httpPost方法的时候,会将下面的这段代码拿上去,替换掉cb(ersponseObject),其实就是下面的方法整体拿到上面去实现,吧方法或函数当做一块内容来整体执行。
拿上去的代码:
cb:^(id responseObj) {
nsdictionary *dic = [responseObject mj_jsonObject];
dispatch_async(dispatch_get_main_queue(), ^{
NSString *status = dic[@”s”];
NSDictionary *jsonData = dic[@”d”];
NSLog(@”status:%@ data:%@”,status,jsonData);
}
用来替换的代码:
if (responseObject) {
cb(responseObject);
}
说的可能有点不专业,看的人也有点糊涂,大体能明白是什么意思就行了。
block的应用有很多,网络请求的处理就是一个方面。

现在有这么一个需求,我有一个逻辑比较复杂的页面,其中有充值按钮,账户余额显示,在个人信息的viewcontroller中也能看到账户余额,我现在点了充值,在A页面刷新了余额,怎么才能让个人信息页的余额也刷新呢?
有人说进个人页面的时候发网络请求。对于一些应用是可以,如果我个人信息页展示的信息在我第一次登陆的时候就当做配置列表给返回了呢?难道重新请求一次配置列表或者跟服务器商量加个接口吗,其实不用,也没必要。我们可以在代码里,写一个事件机制,每一次发送请求的时候,都有对应的事件,比如事件名叫充值,比如叫送花,比如叫私聊,我把这个事件,和请求的URL,和返回数据的data绑定在一起,在一个类里面,加入到一个数组里,如果这个数组里面有这个事件了,就移除之前的,如果没有就把这个事件加到数组,然后在个人信息的配置页上对这个数组进行观察kvo或者通知或者别的方式都可以,数组变化了加了什么东西,其他页做对应的改变就可以了,真实情况比我说的要复杂,而且解决方案比我提的要精确要完美,而且思路比我说的清晰,我只是刚入单位看了两天代码的感觉,毕竟新手,还要学习

0 0
原创粉丝点击