在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西。其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的,今天就做一个小的demo来详细的了解一下iOS中的多线程的东西。可能下面的东西会比较枯燥,但还是比较实用的。
多线程用的还是比较多的,废话少说了,下面的两张截图是今天我们实验的最终结果,应该是比较全的,小伙伴们由图来分析具体的功能吧:
功能说明:
1、点击同步请求图片,观察整个UI界面的变化,并点击测试按钮,红色是否会变成绿色。
2、NSThread按钮,是由NSThread方式创建线程并执行相应的操作。
3、Block操作按钮是用Block创建操作,并在操作队列中执行,下面的是Invocation操作
4、serial是GCD中的串行队列,concurrent是GCD中的并行队列
好啦,上面的咸蛋先到这儿,代码该走起啦。
一、准备阶段
1.不管使用代码写,还是storyboard或者xib等,先把上面所需的控件初始化好以便使用
2.点击测试UI按钮,改变下边label的颜色的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//改变lable的颜色,在红绿颜色之间进行交换 - (IBAction)tapTestButton:(id)sender { static int i = 1; if (i == 1) { _testLabel.backgroundColor = [UIColor redColor]; i = 0; } else { _testLabel.backgroundColor = [UIColor greenColor]; i = 1; } } |
3.从网络上获取图片,并使用主线程显示进程调用情况
1 2 3 4 5 6 |
//从wang'lu获取图片数据 -(NSData *) getImageData { _count ++; int count = _count; //线程开始启动<br> |
1 2 3 4 5 6 7 8 9 |
NSData *data; [NSThread sleepForTimeInterval:0.5]; data = [NSData dataWithContentsOfURL:[NSURL URLWithString:IMAGEURL]]; NSString *str = [NSString stringWithFormat:@"%d.线程%@完毕",count,[NSThread currentThread]]; //请求数据的任务由其他线程解决,所以LogTextView的内容由主线程更新,也只有主线程才能更新UI [self performSelectorOnMainThread:@selector(updateTextViewWithString:) withObject:str waitUntilDone:YES]; return data; } |
4.上面的用到了主线程来调用updateTextViewWithString方法,因为只有主线程才能更新UI,updateTextViewWithString:这个方法负责把线程的执行信息显示在View上,代码如下:
1 2 3 4 5 6 7 8 9 |
//在ViewController上显示图片请求情况 -(void)updateTextViewWithString:(NSString *)str { NSString *old_str = [NSString stringWithFormat:@"%@n%@",_logTextView.text, str]; _logTextView.text = old_str; //改变Label的颜色,便于观察 [self tapTestButton:nil]; } |
5.把请求完的图片加载到ImageView上
1 2 3 4 5 6 |
//更新图片 -(void) updateImageWithData:(NSData *)data { UIImage *image = [UIImage imageWithData:data]; [_testImage setImage:image]; } |
6.加载图片的,也就是请求数据后在ImageView上显示