04-iOS中多线程实现的方案现在给大家介绍一下,iOS中开发多线程用到的几种技术。首先,隆重介绍一个技术,叫Pthread,Pthread这个技术,我们简单看看,它能干什么。首先,它有一个特点,这哥们是C语言的。它是一套通用的多线程API,适用于Unix、Linux、Windows,也就是说,用Pthread写的程序在UnixLinuxWindows上都能跑;它是跨平台、可移植的。看了这几个特点,大家觉得Pthread牛X吗?相当牛X,但是它的使用难度大。因为越牛X的东西,实际上越靠近底层,使用难度就相对会大。那大家看这边的使用频率,在iOS里面,它是几乎不用。为什么呢?因为太费劲了!实际上不是难度大的问题,是太费劲了。平时人家写几句话就可以了,它是写一坨。所以这个几乎不用。但是Pthread这个技术虽然说几乎不用,但是每个程序员都有一颗底层的心。知道不知道是一回事,讲不讲是另外一回事。是吧,所以呢,给大家演练一下Pthread.打开xcode,创建项目02-Pthread演练(1)删掉废代码,写一个touchBegan方法(2)在下面,我先写一个注释Pthread演练(3)下面,我写一个方法-(void)pthreadDemo{}(4)然后在touch里面调用这个方法:[selfpthreadDemo](5)那么要使用pthread,首先需要导入pthread的头文件#importPthread.h(6)这个头文件,我们先看一眼,跳进去,跳进去之后,实际上,大家在看头文件的时候,有一个小技巧。看一下这个,这个是我们pthread头文件,然后看这个地方,这时pthread文件所在的目录。然后看这里,这个是什么呢?这是头文件所在的大类。这里有个usr/include,平时我们用的都是Foundation,在这个frameworks里面,而在usr/include里面,这下面通常都是跨平台的。(7)也就是说,一旦头文件是定义在这个范围里的,它有几个特点:第一,是跨平台的,跨平台就不是OC的吧。都是C的。这是它一个特点。另外一个特点,就是:定义在这里的头文件通常是没有注释的。(8)有同学会说,这不是有注释吗,再往下走走,这些都没有注释了吧,以前是不是告诉大家,没事到头文件里面looklook,这个实际上,我们在用pthread的时候,look的效果不是特别好。(9)然后,现在给大家看一下,pthread_creatcreat是创建线程的意思,创建线程,比如说这个方法,我跳进头文件,大家看,这头文件里面是不是啥也没有。没有注释,那么没有注释怎么办呢?这里,有一个地址,给大家隆重推荐一下啊,这个地址叫HTTP://baike.baidu.com(10)大家访问过这个网站吧,(11)接下来,给大家讲一下这个方法的参数,第一个,表示的是线程代号的地址,也就是说我们要新建的线程的代号的地址。第2个表示线程属性;第3个表示的是调用函数的指针前边我们做了一个耗时操作的演练,我们是不是建了一个叫longoperation的耗时方法,把那个方法调过去。实际上,开线程是什么?开线程相当于这样。就是说,我们有一个程序,默认开启一条主线程,从上往下执行。然后执行的时候,某一个地方有一个耗时的方法。既然有一个耗时的方法,我们是不是就要新建一个子线程,将耗时方法放到子线程去执行。所以说,在创建线程的时候,通常会有一个调用函数,C语言里面讲的是函数,那么这个耗时方法就放在子线程了。第4个参数:就是传递给该函数的参数然后,这4个参数介绍完了后,再看一下返回值;这个返回值如果是0,表示正确,如果是非0,表示错误码。这地方也是C语言的一个特点,就是C语言里面,它有好多底层的框架里面,如果正确,就返回0,因为正确只有一种情况;而错误有很多种。所以说,如果是非0,它就返回各种各样的数字,我们就可以判断出是哪一种错误好,这些参数介绍完了之后,我们简单看一下,这个程序只是给大家演练一下,满足一下大家那颗底层的心。这个程序平时不用写。我们看,第一个参数,线程代号的地址,它是叫pthread_t,这是在C语言里,它实际上有个特点,就是说,在C语言中,类型的结尾通常识_t或_ref我们在学核心绘图的时候,是不是有什么什么ref,_t也是一种类型。在这写一下,pthread_t这里呢,我写一个pthreadID这个写完之后,在C语言里,定义类型的是_t,或者ref而且不需要使用**。这个是什么原因,实际上我们跳进头文件,这是一个类型,我再跳一下,大家看,它在定义类型的时候,是不是已经有了一个*了,已经是一个指针了,所以我们在用的时候,通常就是找到对应的这个t,它要这个类型,我们就找到这个类型。**是不是就表示指针的地址啊,那么我们在这里写一个&threadID,线程的属性,我们不管它,先传一个NULL;然后,再看第三个参数,第三个参数的类型,我不知道有没有同学看到这种类型的时候,就是一看C语言的这种东西的时候,我靠,什么破玩意,一堆**,看的眼都花了。这个void*表示的是返回值然后中间这个*表示的是函数的指针然后再往后看,这个void*,表示的是参数实际上这个地方的格式是:返回值(中间是函数指针)(后面这个是参数)光有这个还不够,这也是将这个pthread演练的一个很重要知识点,就是void,大家是不是经常看一些C语言的框架里面都有这个东西。Void跟什么东西是类似的呢?和OC里面的id是等价的。既然明白这个,那刚才这个地方要写的话,就是id(*)(id),就是返回一个id,中间是一个函数名,后面是一个id参数。那看清楚这个之后,我就在这写一个,这是C语言的:void*demo(void*param){}这么一个函数。这个函数,它有返回值,返回值类型为void*,这里我需要它返回一个东西返回一个NULL好,这写完了之后,我在这是不是就直接调用函数的地址啊,&demo,注意啊,这个demo不要带参数,就直接把它的名字放在这就行了然后最后一个,传个NULL。好,现在,这个方法就基本告一段落了。它的返回值,跳进头文件看下,它的返回值是不是int类型啊,这个int类型,返回来就是intresult=这个if(result==0){printf(“OK”)}else{printf(“error%d”,result)}我把这个错误码打印一下。这样呢,是不是就可以直接调用了,为了验证它这个方法能够调用我在这里写NSlog(@”%@”,[NSThreadcurrentThread])是在所有多线程技术中都可以使用的。现在我们运行看一眼,点一下,大家看,这个方法是不是就把currentThread打印出来了,打印出来了,就说明这个函数的调用已经OK了,而且它这个地方,它这个OK没有出来,这里我把这个printf改为nslog,然后下面这个地方我也改为NSLog。在运行一下