线程之间通信

NSThread

  • 创建并启动一个子线程
  • 子线程完成任务后回到主线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)viewDidLoad {
[super viewDidLoad];

// 创建子线程并执行doWork任务。
[NSThread detachNewThreadSelector:@selector(doWork:)
toTarget:self
withObject:@{@"name": @"lucaslee"}];
}

- (void)doWork:(NSDictionary *)info {
NSLog(@"执行数据库访问,下载网络图片等。当前线程 %@ 参数 = %@", [NSThread currentThread], info);

// 回到主线程。
[self performSelectorOnMainThread:@selector(doneWork:)
withObject:@{@"name": @"lucaslee"}
waitUntilDone:NO];
}

- (void)doneWork:(NSDictionary *)info {
NSLog(@"完成任务 当前线程 %@ 参数 = %@", [NSThread currentThread], info);
}

参数说明

performSelectorOnMainThread的参数说明

参数 参数类型 描述
aSelector SEL 调用方法
arg id 传递参数
wait BOOL 是否等待执行完成后再继续往下执行,同GCD的async sync作用一样

回到指定线程

1
2
3
4
[self performSelector:@selector(doneWork)
onThread:[NSThread mainThread]
withObject:@{@"name": @"lucaslee"}
waitUntilDone:YES];

onThread 回到指定的线程

这个方法是在NSObject中的,所以只要继承自NSObject,就可以调用该方法,该方法可以理解为,调用某个对象(这里是self)的某个方法(selector)并传递参数(arg),是否需要阻塞等待(wait)方法执行完毕。

GCD

相对于NSThread的线程通讯,GCD就太简洁了,有些难以置信。

1
2
3
4
5
6
7
8
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSLog(@"执行数据库访问,下载网络图片等。当前线程 %@", [NSThread currentThread]);

dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"完成任务 回到主线程,可以刷新界面等处理 %@", [NSThread currentThread]);
});
});

NSOperationQueue

1
2
3
4
5
6
7
8
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
NSLog(@"执行数据库访问,下载网络图片等。当前线程 %@", [NSThread currentThread]);

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"完成任务 回到主线程,可以刷新界面等处理 %@", [NSThread currentThread]);
}];
}];
坚持原创技术分享,您的支持将鼓励我继续创作!