//  ViewController.m
#import "ViewController.h" @interface ViewController ()
{
//任务队列,能够自动管理多个任务(NSOperation的对象)
NSOperationQueue *_operationQueue;
}
@end @implementation ViewController #define kUrlString @"http://jsonfe.funshion.com/?pagesize=10&cli=iphone&page=1&src=phonemedia&ta=0&ver=1.2.8.2&jk=0"
#define kImageString @"http://img1.funshion.com/attachment/fs/112/200/112200.jpg?1387939530" - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_operationQueue = [[NSOperationQueue alloc] init];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setTitle:@"thread" forState:UIControlStateNormal];
[btn setFrame:CGRectMake(,,,)];
[btn addTarget:self action:@selector(threadMethod) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn]; UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn1 setTitle:@"operation" forState:UIControlStateNormal];
[btn1 setFrame:CGRectMake(,,,)];
[btn1 addTarget:self action:@selector(operationMethod) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1]; UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn2 setTitle:@"GCD" forState:UIControlStateNormal];
[btn2 setFrame:CGRectMake(,,,)];
[btn2 addTarget:self action:@selector(gcdMethod) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn2]; /*严重的费时操作 等好久才能显示
for (int i=0; i<20; i++) {
for (int j=0; j<50; j++) { NSURL *url =[NSURL URLWithString:kImageString];
//同步下载数据的方法
NSData *data = [NSData dataWithContentsOfURL:url];
// UIImage *ima = [UIImage imageWithData:data];
UIImageView *ima=[[UIImageView alloc]initWithFrame:CGRectMake(0+j*3, i*3, 2, 2)];
ima.image=[UIImage imageWithData:data];
[self.view addSubview:ima];
}
}
*/
} //gcd是iOS4.0之后出现的技术,Grand Centeral Dispatch->苹果高度封装的处理多线程的技术,可以理解为block版本的NSOperation和NSOperationQueue
- (void)gcdMethod{
//gcd中有一个主队列,用于管理和调度主线程;有三个优先级的全局队列,来管理子线程
//dispatch_get_global_queue 第一个参数为设置队列的优先级 0为默认优先级 2为最高优先级 -1为低优先级;第二个参数为预留参数,一般也写成0
dispatch_async(dispatch_get_global_queue(, ), ^{
//利用全局队列,在主线程之外单独开辟了一个线程,线程执行block方法
NSURL *url =[NSURL URLWithString:kUrlString];
NSString *result = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
if (result) {
//通过主队列回到主线程,主线程中执行block
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"result:%@",result);
}); }else{
NSLog(@"error!");
}
});
} //NSOperation,以任务为导向的线程,可以叫做开启一个任务
//NSOperationQueue 任务队列,来维护多个任务(线程)
- (void)operationMethod{
//一般使用NSOperation的子类来进行多线程操作
NSInvocationOperation *oper = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage) object:nil];
//[oper start]; 需要调用此方法 oper对象才会开辟线程,让线程执行sel方法
//添加到队列后,队列会自动让oper对象开辟线程并执行sel方法
[_operationQueue addOperation:oper];
//[_operationQueue addOperations:<#(NSArray *)#> waitUntilFinished:<#(BOOL)#>]
}
//NSThread
- (void)threadMethod{
//NSThread iOS中最早出现的线程类
//detachNewThreadSelector 在主线程之外单独开辟一个线程来执行sel方法
//toTarget sel所在的对象
[NSThread detachNewThreadSelector:@selector(downloadString) toTarget:self withObject:nil];
} //同步下载一张图片
- (void)downloadImage{
@autoreleasepool {
NSURL *url =[NSURL URLWithString:kImageString];
//同步下载数据的方法
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
if (image) {
//给主线程
[self performSelectorOnMainThread:@selector(receiveImage:) withObject:image waitUntilDone:NO];
//线程之间的通信
//[self performSelector:<#(SEL)#> onThread:<#(NSThread *)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>]
}else{
NSLog(@"下载失败!");
}
}
} - (void)receiveImage:(UIImage *)image{
//colorWithPatternImage 此方法比较消耗GPU,需要慎用,而且要求view与imagesize 一致
// self.view.backgroundColor = [UIColor colorWithPatternImage:image]; //多线程可以解决费时操作 比普通的下载图片快很多
for (int i=; i<; i++) {
for (int j=; j<; j++) {
UIImageView *ima=[[UIImageView alloc]init];
ima.frame=CGRectMake(+j*, i*, , );
ima.image=image;
[self.view addSubview:ima];
}
}
} //线程的生命周期与函数一致,函数开始则线程开始;函数执行完毕,线程自动结束
//在主线程之外开辟的线程叫子线程或者工作线程
- (void)downloadString{
//执行耗时操作
//主线程的自动释放池,子线程无法使用,需要自己手动添加
@autoreleasepool {
NSURL *url = [NSURL URLWithString:kUrlString];
//同步请求数据的方法,会阻塞当前线程
NSString *result = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
if (result) {
//需要将数据给到UI主线程,理论上子线程没有被分配足够的资源来操作UI,所以对于UI的操作一般在主线程中完成。
//子线程和主线程之间的通信
[self performSelectorOnMainThread:@selector(receiveString:) withObject:result waitUntilDone:NO]; //[self performSelector:<#(SEL)#> withObject:<#(id)#>]
}else{
NSLog(@"load error!");
}
}
} //在主线程中执行的方法
- (void)receiveString:(NSString *)result{
NSLog(@"ui result:%@",result);
//操作UI也在主线程中
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

thread、operation、GCD的更多相关文章

  1. TensorFlow中的Session、Graph、operation、tensor

    TensorFlow中的Session.Graph.operation.tensor

  2. iOS开发笔记5:多线程之NSThread、NSOperation及GCD

    这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方 ...

  3. 多线程相关(pthread 、NSThread 、GCD、NSOperation)

    进程 进程是指在系统中正在运行的一个应用程序 线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 1个线程中任务的执行是串行的(执行完上一个才能执行下一个) 多线程 1个进程中可以 ...

  4. iOS开发之多线程(NSThread、NSOperation、GCD)

    整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...

  5. iOS开发之多线程技术(NSThread、OperationQueue、GCD)

    在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西.其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的 ...

  6. iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)

    Dispatch Group在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现.如果只是使用一个Serial Dispatch Queue(串行队列)时,只 ...

  7. Linux Process/Thread Creation、Linux Process Principle、sys_fork、sys_execve、glibc fork/execve api sourcecode

    相关学习资料 linux内核设计与实现+原书第3版.pdf(.3章) 深入linux内核架构(中文版).pdf 深入理解linux内核中文第三版.pdf <独辟蹊径品内核Linux内核源代码导读 ...

  8. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  9. python中thread的setDaemon、join的用法的代码

    下面内容是关于python中thread的setDaemon.join的用法的内容. #! /usr/bin/env python import threading import time class ...

随机推荐

  1. NEXTDAY

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include "com_time ...

  2. 在linux上安装psycopg2出错--Error: pg_config executable not found.

    这个错误可能是因为缺少PGSQL的相关库吧. 网上有很多解决办法,我最终用以下方式解决: yum install postgresql postgresql-devel python-devel

  3. struts2文件下载,动态设置资源地址

    转自:http://blog.csdn.net/ctrl_shift_del/article/details/6277340 ServletActionContext.getServletContex ...

  4. <select>在chrome浏览器下背景透明问题

    在上篇文章<只用CSS美化选择框>运用了背景透明的技巧来美化选择框,但在chrome浏览器下遇到了跟ie.ff不一样的透明效果,下面重现一下: 在一个大的div(背景红色)内放置一个sel ...

  5. uva494 Kindergarten Counting Game

    #include<bits/stdc++.h>using namespace std;int main(){ int n=0; char a; int flag=1; while((sca ...

  6. 端口扫描器——ZenmapKail Linux渗透测

    3.3  端口扫描器——ZenmapKail Linux渗透测​ Zenmap(端口扫描器)是一个开放源代码的网络探测和安全审核的工具.它是Nmap安全扫描工具的图形界面前端,它可以支持跨平台.使用Z ...

  7. UIBarButtonItem不能获取frame

    在使用KxMenu这个厉害的控件做竖直列表的时候,发现UIBarButtonItem不能获取到frame,UIBarButtonItem是NSObject的子类,他不是一个uiresponed或者ui ...

  8. Rain on your Parade

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  9. C++做client Java做客户端传送数据

    因为要用到,但发现Java怎么都收不到C发来的数据,除非C端自动挂掉,java会一口气全收回来. 后来才发现是因为C发过来的Java用readline是读不到回车的,所以会一直等待. 所以不要用rea ...

  10. 转载关于KeyPress和KeyDown事件的区别和联系

    KeyDown:在控件有焦点的情况下按下键时发生. KeyPress:在控件有焦点的情况下按下键时发生. KeyUp:在控件有焦点的情况下释放键时发生. 1.KeyPress主要用来接收字母.数字等A ...