技术文章分类(180)

技术随笔(11)

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:方法是线程安全的

 

 

posted @ 2014-07-25 09:36  坤哥MartinLi  阅读(1106)  评论(0编辑  收藏  举报