//注:无论哪一种方式,都不允许在子线程中操作UI
【NSThread】(OC线程库)
//创建一个线程并启动
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(oneRun:) object:nil];
//设置name属性
thread.name = @"线程1";
[thread start];
//创建线程(会自动启动)
[NSThread detachNewThreadSelector:@selector(twoRun) toTarget:self withObject:nil];
//获取当前线程
NSThread *thread = [NSThread currentThread];
//对一个子线程发送关闭消息(只是发送一个消息,子线程并不会真的关闭)
[thread cancel]
//判断当前线程是否收到关闭消息
[thread isCancelled]
//退出(关闭)当前线程
[NSThread exit];
//线程锁及开关方式
//多个线程对同一个变量进行操作是不安全的,需要加锁保证同时只能有一个线程操作
_lock = [[NSLock alloc] init];
[_lock lock];
[_lock unlock];
//在子线程中调用主线程的方法(子线程中禁止操作UI),最后YES代表等主线程方法执行完以后在执行子线程,为NO表示同时进行
[self performSelectorOnMainThread:@selector(refreshUI:) withObject:nil waitUntilDone:NO];
//NSThread线程结束的自动发送的广播:NSThreadWillExitNotification
【NSOperationQueue】(任务队列)
//创建操作队列(任务队列)
_queue = [[NSOperationQueue alloc] init];
//最大允许同时并发的任务数量
_queue.maxConcurrentOperationCount = 4;
//创建一个普通任务
NSInvocationOperation *operationOne = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationOne) object:nil];
[operationOne setCompletionBlock:^{
NSLog(@"任务完成的回调");
}];
[_queue addOperation:operationOne];
//创建一个block任务
NSBlockOperation *operationTwo = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i<10; i++) {
NSLog(@"two = %d",i);
sleep(1);
}
}];
operationTwo.completionBlock = ^{
NSLog(@"two end = %d",_queue.operations.count);
};
[_queue addOperation:operationTwo];
【GCD】(Grand Central Dispatch)(block版的线程队列)
//最简单也是效率最高的
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"这里是子线程");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"此句是在在主线程中执行的");
});
});