首页 > 编程语言 > 详细

在多线程中进行UI操作

时间:2015-08-14 15:19:15      阅读:220      评论:0      收藏:0      [点我收藏+]

那么在子线程中的UI操作如何处理呢?有两种方法:

一:在子线程,你需要进行的UI操作前添加dispatch_async函数,即可将代码块中的工作转回到主线程

 dispatch_async(dispatch_get_main_queue(), ^{  
            //更新UI操作  
            //.....  
        });

 dispatch_async函数是异步操作,对于比较耗时的操作也可以这样处理: 

技术分享
dispatch_async(dispatch_get_global_queue(0, 0), ^{  
    // 处理耗时操作的代码块...  
      
    //通知主线程刷新  
    dispatch_async(dispatch_get_main_queue(), ^{  
        //回调或者说是通知主线程刷新,  
    });  
      
});
技术分享

dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块到该队列。

 dispatch_get_global_queue(0, 0),指用了全局队列。

一般来说系统本身会有3个队列。

global_queue,current_queue,以及main_queue.

获取一个全局队列是接受两个参数,第一个是我分配的事物处理程序块队列优先级。分高低和默认,0为默认2为高,-2为低

 二:performSelectorOnMainThread

performSelectorOnMainThread是指在主线程上执行某个方法,比如数据下载后,更新UI界面等操作

  例如:在子线程中使用[self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];

 

技术分享
-(void)setupThread:(NSArray*)userInfor{  
  
   [NSThread detachNewThreadSelector:@selector(threadFunc:) toTarget:self withObject:(id)userInfor];  
  
}  
  
- (void)threadFunc:(id)userInfor{  
  
   NSAutoreleasePool*pool = [[NSAutoreleasePool alloc] init];  
  
   //。。。。需要做的处理。  
  
   //这里线程结束后立即返回  
  
  [self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];  
  
  [pool release];  
  
}  
技术分享

 

performSelectorOnMainThread通知主线程执行函数endThread。

再次强调子线程内不要进行任何UI操作,不要刷新界面。如果需要进行这些操作,通过dispatch_async或performSelectorOnMainThread这两种方法,调出主线程中的方法去执行

在多线程中进行UI操作

原文:http://www.cnblogs.com/yjg2014/p/4729799.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!