iOS学习笔记-----block function简单使用

离上次写笔记过去半年了,哎!没坚持几天啊。。。。这几个月里由于有两个项目在做,因此就一直无暇顾忌博客的事情。不过最近我发现我光这样埋头写代码、做项目也并不好,知识是需要积累的,每天埋头敲打码而不思考只会做一些重复的工作是得不到进步的!!!当然啦,我再做这两个项目也做了很多重复的工作。。但是嘞同时也学到了好多新的东西,现在趁有那么一点点空闲时间,我还是得总结一下,不然不知道什么时候就把这些重要的东西给忘了,就好像从来没学过一样~···这可不行。。。

好吧!还是进入正题吧····今天我要记下的是block function,传说中的块函数。听起来就高深莫测的样子,它也确实挺高深的,不过我这里并没打算要研究得非常透彻,而且我也没法研究得很透彻,能力有限,先慢慢来吧!····看清题目吧···简单使用,就是简单使用而已!!!而且它的详细定义和基本方法百度都有,这里也不再赘述了。

从概念开始吧,首先我们要知道它是什么才能知道怎么用它!就我的理解呢,块函数就是把一块代码,把它弄成一个函数,而且这个函数不一定要有函数名,而且这个块函数是可以有指针传递的,就跟C++指针函数差不多,它们的定义和使用都非常相似,当然也有不同的地方,最关键的就是变量作用域的问题。详情请参考百度。。。好啦,对我来说,块函数实际上本质也是一个变量,基本在OC中所有对变量的操作对块函数都适用,而它与变量的不同之处或者说优势就在于它是能够通过指针传递一个function(这里翻译成功能更适合···),而不仅仅是一个值而已。这样就大概理解了吧。。。我是之前对C++函数指针都没多大了解的,是知道块函数之后才慢慢对函数指针理解的,我相信如果懂函数指针的就更容易弄懂块函数了(不过话说懂函数指针的也没必要看我这篇文章了o(╯□╰)o····)

OK啦,概念弄清楚了。。。而至于使用····那些基本的使用我这里就不打算再复制百度了。。。一搜一大把,我这里主要是上次项目中我需要实现一个功能而利用块函数来实现所以想记录一下。。方便之后用到,也方便有同样需求的童鞋能从这里得到些什么就OK了·····上次的项目里。在做最基本的从服务器抓取数据然后显示在界面中,这个过程谁都知道是需要用异步实现,单纯同步的话,用户体验可想象得到····关键是···在什么时候异步呢?最理想的方案当然是在访问服务器的时候异步处理,然后交给客户端处理数据,完美!可是···可是由于我们团队经验不足,后台在写接口的时候把访问服务器的操作全写成了同步。。。这···没办法啦,只能在客户端来异步操作啦。然后呢,我首先想到的就是利用NSThread的多线来处理,每次处理数据都新开一个NSThread子线程处理就OK拉···这也说我之前一直使用的方式,这样写确实是没问题,也很OK··完全能够满足业务需求。。。但是在之后接数据的过程中我发现,···有一个发消息的操作,它需要先上传一些媒体到一个服务器中,然后返回一个url,再把这个消息发送到另一个服务器中,也就是说我需要进行两步异步操作,而且还不能同步进行····先不说甲方多么蛋疼吧····既然有需求我等程序员能有什么办法···写呗!···然后用NSThread的方法写着写着我就崩溃了···卧槽,这样跳来跳去,这么多@Selector····别说别人了,就是我自己也会再十天之内再看都不知道我自己在写什么····于是我就思考着有什么办法在不改接口的前提下能够简化下代码···至少别让它们这么分散··搞得我连selector函数名都不知道怎么取好·····然后我就想到了UIView里面的animation静态函数····,完整的定义是这样:

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

然后使用是这样的:

[UIView animateWithDuration:0.3 animations:^{
        //需要做的动画
    } completion:^(BOOL finish){
        //根据finish的值判断动画是否完成而进行其他操作
    }];
UIView就实现了我要进行一次Selector跳转的操作,而把它放在一个函数中的操作····真是太神奇了,我要是能像这样实现一个下载的函数就太棒了。。。于是我开始动手····百度··google······但是很失望的发现···并没有类似的代码······看来还是得从头学block开始··多学点东西总没什么坏处吧····,而且还有现成的UIView animation可以参考,··虽然只是定义···但也帮了我足够的忙了···,然后就模仿了一下UIView animation的写法写了个定义:

#import <Foundation/Foundation.h>

@interface BlockThread : NSObject

//异步下载的块函数
+(void)downloadWithAsync:(NSInteger (^)(void))Async completion:(void (^)(NSInteger result))completion;
@end

这就是我定义的想实现异步下载和下载完成后在同一个函数的类的定义了····暂且取名叫BlockThread吧···因为我也不知道取什么名好····定义是写出来了···可是关键是实现啊···没实现定义有什么用···之后在查看了几篇关于block的讲解之后慢慢地有了思路····把块函数当做变量操作····于是··Async是一个用户传进来的块函数参数,我可以在函数中使用它···也可以把它保存起来··在需要的时候使用它,···completion同样也是一个用户传进来的块函数参数···blablabla···,就这样 有思路了···先把用户传进来的参数保存起来,然后再需要的时候使用它·····也就是说我可以在这个函数中把Async和completion的指针传递给我这个类的成员变量,然后也是利用NSThread,在异步线程里执行Async,当执行完之后通过self performSelectorOnMainThread跳到另一个函数里执行completion这个函数···这样我需要的功能不就实现了么····于是就有了它的实现代码

#import "BlockThread.h"
//块函数作为类的成员变量
NSInteger(^myAsnc)(void);
void(^myCompletion)(NSInteger isSuccess);


@implementation BlockThread
+(void)downloadWithAsync:(NSInteger (^)(void))Async completion:(void (^)(NSInteger))completion{
    //将用户定义的块函数指针传递到本类的成员变量
    myAsnc = Async;
    myCompletion = completion;
    // 还是使用thread进行下载
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(loadData) object:nil];
    [thread start];
}
//异步下载过程,执行异步块函数
+(void)loadData
{
    NSInteger result = myAsnc();
    [self performSelectorOnMainThread:@selector(loadFinished:) withObject:[NSNumber numberWithInt:result] waitUntilDone:YES];
}
//下载完成执行完成块函数
+(void)loadFinished:(NSNumber *)resultNum{
    NSInteger result = [resultNum boolValue];
    myCompletion(result);
}
@end


接着我就迫不及待的用它使用了一番····感觉还不错····:

[BlockThread downloadWithAsync:^NSInteger{
            
            NSInteger result;
            //执行下载任务,一般都是很耗时的,然后将下载的响应结果返回给result;
            return result;//返回result的值给completion函数
        } completion:^(NSInteger result){
            if (result == 1) {
                //如果下载成功·····blablabla···
            }
        }];


啊哈哈哈···不管好用不好用···反正我需要的功能我是实现了··而且对块函数也有了更深的理解。。。

好吧···今天的笔记就记到这吧····我自己复习的目的是基本达到了····以后需要也可以直接拿来用了····

恩··还是记笔记来得实在点~····

擦嘞···22::15了····《爸爸去哪儿》开始了······看去·····各位拜拜!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值