IOS多线程之dispatch_async
1,最常用的莫过于加载异步加载网络数据,再回到主线程刷新UI
完整事例:https://github.com/MartinLi841538513/Dispatch_async
NSString *urlString = @"http://old.idongway.com/sohoweb/q?method=store.get&format=json&cat=1"; [SVProgressHUD show];//loading 视图 dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSDictionary *result = [InteractWithServerOnJSON interactWithServerOnJSON:urlString];//加载网络数据 //因为需要再回到主线程关闭loading dispatch_sync(dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; //dismiss loading视图 NSArray *stores = [result objectForKey:@"stores"]; //获取网络数据,并可以在这个位置刷新主线程UI NSLog(@"%@",[[stores firstObject] valueForKey:@"storeName"]); }); NSLog(@"dosometing1"); });
在此,介绍另外一种GCD常用的解决多线程安全问题的做法
dispatch队列是线程安全的,可以利用串行队列实现锁的功能。比如多线程写同一数据库,需要保持写入的顺序和每次写入的完整性,简单地利用串行队列即可实现:
dispatch_queue_t queue1 = dispatch_queue_create("com.dispatch.writedb", DISPATCH_QUEUE_SERIAL); - (void)writeDB:(NSData *)data { dispatch_async(queue1, ^{ //write database }); }
下一次调用writeDB:必须等到上次调用完成后才能进行,保证writeDB:方法是线程安全的