ios里几种常用开线程的方法主要有以下几种
1.NSObject
[obj performSelectorInBackground:@selector(testTherd:) withObject:@"performSelectorInBackground"];
2.NSThread
NSThread * newThread = [[NSThread alloc] initWithTarget:ojb selector:@selector(testTherd:) object:@"newThread"];
[newThread start];//需要手动开启
NSThread * newThread = [NSThread detachNewThreadSelector:@selector(testTherd:) toTarget:obj withObject:@"detachNewThread"];
这两种方法常用的。
3.NSOperationQueue
维护NSOperation。
NSOperation 这个类是抽象类,不能直接使用,需要继承此类使用子类,系统提供了2个子类 (NSInvocationOperation 和 NSBlockOperation) 。
自己定义继承的NSOperation分两种情况
非并发执行
并发执行
当重写了-(void)start 同时有想用 -(void)main 需要手动调用,当不写-(void)start 写了-(void)main 时,系统会调用 -(void)main。
简单使用
NSOperationQueue * queue = [[NSOperationQueue alloc] init];
NSInvocationOperation * invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(testTherd:) object:@"testInvocationOperation"];
[queue addOperation:invocationOperation];
4.GCD(Grand Central Dispatch)
此技术在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中,主要是为了使用多线程时候能高效利用多盒资源。
gcd 的使用和 NSOperationQueue 有些类似,只不过是C级别的。
需要一个队列 和 要执行的任务。
队列有以下几种:
dispatch_queue_create 创建新的队列用户自己的
dispatch_get_global_queue 获取全局的队列
dispatch_get_main_queue 获取主线程队列
dispatch_queue_t dispatch = dispatch_queue_create("mydispatch", nil) ;
任务是block内容(不完全正确,可能是c函数指针)
例如:
void (^task1)() = ^(){
sleep(1);
NSLog(@"%d",[NSThread isMainThread]);
NSLog(@"task1");
};
接下来要做的是把任务加到队列里,分为2种,同步和异步
dispatch_async(dispatch, task1);//异步处理
dispatch_sync(dispatch, task1);//同步处理
这里的同步处理 NSLog(@"%d",[NSThread isMainThread]); 这里大打印出来的是1.官方给出的是 As an optimization, this function invokes the block on the current thread when possible,所以这个并不一定会开启新的线程。
关于gcd 给出个大侠的链接:GCD