//dispatch_queue 是队列名称,在调试时辅助
var q =dispatch_queue_create("lllll",DISPATCH_QUEUE_SERIAL) //SERIAL 代表串行
dispatch_sync(q) { //sync 是同步
print("串行同步 %@", [NSThread.currentThread()]//同步操作不会新建线程、操作顺序执行(没用!)
}
dispatch_async(q) { //async 是异步
print("串行异步 %@", [NSThread.currentThread()]) //异步操作会新建线程、操作顺序执行(非常有 用!)场景:既不影响主线程,又需要顺序执行的操作!
}
var q =dispatch_queue_create("lllll",DISPATCH_QUEUE_CONCURRENT) //CONCURRENT 代表并行
dispatch_sync(q) { //sync 是同步
print("并行同步 %@", [NSThread.currentThread()] //同步操作不会新建线程、操作顺序执行
}
dispatch_async(q) { //async 是异步
print("并行异步 %@", [NSThread.currentThread()]) //异步操作会新建多个线程、操作无序执行(有用,容易出错!)队列前如果有其他任务,会等待前面的任务完成之后再执行场景:既不影响主线程,又不需要顺序执行的操作!
}
var q =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) //全局队列是系统的,直接拿过来(GET)用就可以与并行队列类似,但调试时,无法确认操作所在队列
dispatch_sync(q) { //sync 是同步
print("全局同步 %@", [NSThread.currentThread(),i] //同步操作不会新建线程、操作顺序执行
}
dispatch_async(q) { //async 是异步
print("全局异步 %@", [NSThread.currentThread()],i) //会新建多个线程、操作无序执行队列前如果有其他任务,会等待前面的任务完成之后再执行
}
var q =dispatch_get_main_queue() //每一个应用程序对应唯一一个主队列,直接GET即可在多线程开发中,使用主队列更新UI
dispatch_sync(q) {
print("主队列同步 %@", [NSThread.currentThread()]) //如果把主线程中的操作看成一个大的Block,那么除非主线程被用户杀掉,否则永远不会结束主队列中添加的同步操作永远不会被执行,会死锁
}
dispatch_async(q) {
print("主队列异步 %@", [NSThread.currentThread()]) //主队列中的操作都应该在主线程上顺序执行的,不存在异步的概念
}
// 全局队列,都在主线程上执行,不会死锁
var q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
// 并行队列,都在主线程上执行,不会死锁
var q = dispatch_queue_create("lllll", DISPATCH_QUEUE_CONCURRENT)
// 串行队列,会死锁,但是会执行嵌套同步操作之前的代码
var q = dispatch_queue_create("lllll", DISPATCH_QUEUE_SERIAL)
// 直接死锁
var q = dispatch_get_main_queue()
dispatch_sync(q) {
print("同步任务 %@", [NSThread.currentThread()])
dispatch_sync(q) {
print("同步任务 %@", [NSThread.currentThread()])
}
}
串行队列,同步任务,不需要新建线程
串行队列,异步任务,需要一个子线程,线程的创建和回收不需要程序员参与!
“是最安全的一个选择”串行队列只能创建!
并行队列,同步任务,不需要创建线程
并行队列,异步任务,有多少个任务,就开N个线程执行,
无论什么队列和什么任务,线程的创建和回收不需要程序员参与。
线程的创建回收工作是由队列负责的
“并发”编程,为了让程序员从负责的线程控制中解脱出来!只需要面对队列和任务!
self.myQueue = [[NSOperationQueue alloc] init];
- (void)operationAction:(id)obj
{
NSLog(@"%@ - obj : %@", [NSThread currentThread], obj);
}
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationAction:) object:@(i)];
[self.myQueueaddOperation:op];
[self.myQueue setMaxConcurrentOperationCount:2];//红色字体代表设置同时并发的线程数量能够有效地降低CPU和内存的开销这 一功能用GCD不容易实现
for (int i = 0; i < 10; ++i) {
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
[self operationAction:@(i)];
}];
[self.myQueue addOperation:op];
}
块代码中的self为什么不会造成循环引用?
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
[NSThreadcurrentThread]
[NSThreadsleepForTimeInterval:2.0f];
for (int i =0; i < 10; ++i) {
NSString *str =@"Hello World";
str = [str stringByAppendingFormat:@" - %d", i];
str = [str uppercaseString];
NSLog(@"%@", str);
}
问:以上代码存在什么样的问题?如果循环的次数非常大时,应该如何修改?