1. 想在主线程执行setImage
怎么办?
思路1:采用 performSelector 相关的API:
这么多API,可以采用一个适合的,例如:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
其中 waitUntilDone 后面的BOOL参数。
- 当为YES的时候,先让主线程运行aSelector中的一些操作,之后再进行当前线程中的操作。
- 当为NO的时候,先进行当前线程中的操作,之后让主线程运行aSelector中的一些操作。
思路2:利用 线程间通信
// 回到主线程
dispatch_async(mainQueue, ^{
// 追加在主线程中执行的任务
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程
self.imgView.image = theImage;
});
2. 如何通过 performSelector 传入多参数
- 方法一: 利用数组
把参数放进一个数组/字典,直接把数组/字典当成一个参数传过去,具体方法实现的地方再解析这个数组/字典
NSArray * array =
[NSArray arrayWithObjects: @"first", @"second", nil];
[self performSelector:@selector(fooFirstInput:) withObject: array afterDelay:15.0];
- 方法二: 使用NSInvocation
SEL aSelector = NSSelectorFromString(@"doSoming:argument2:");
NSInteger argument1 = 10;
NSString *argument2 = @"argument2";
if([self respondsToSelector:aSelector]) {
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:aSelector]];
[inv setSelector:aSelector];
[inv setTarget:self];
[inv setArgument:&(argument1) atIndex:2];
[inv setArgument:&(argument2) atIndex:3];
[inv performSelector:@selector(invoke) withObject:nil afterDelay:15.0];
}
3. GCD的四种组合比较总结
- 关于操作队列的比较
操作队列 | 区别 |
---|---|
串行队列 | 顺序执行 |
并行队列 | 不顺序执行 |
- 关于执行方式的比较
执行方式 | 区别 |
---|---|
同步执行 | 同步执行意味着不开线程 |
异步执行 | 异步执行意味着要开线程 |
- 关于组合的总结:是否开新线程的
执行方式 \ 操作队列 | 串行队列 | 并行队列 |
---|---|---|
同步 | 不开新线程 | 不开新线程 |
异步 | 开一个新线程 | 开几个新线程 |
4. 两种常见队列
- 主队列的获取方法
dispatch_queue_t queue = dispatch_get_main_queue();
- 全局并发队列的获取方法
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
网友评论