• 方法1:performSelectorOnMainThread [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO]; 方法2:dispatch_async(dispatch_get_main_queue(), ^{ ......

    方法1:performSelectorOnMainThread
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];


    方法2:dispatch_async(dispatch_get_main_queue(), ^{ ... })

    1. dispatch_async(dispatch_get_global_queue(0, 0), ^{  
    2.     // 处理耗时操作的代码块...  
    3.       
    4.     //通知主线程刷新  
    5.     dispatch_async(dispatch_get_main_queue(), ^{  
    6.         //回调或者说是通知主线程刷新,  
    7.     });  
    8.       
    9. });  
    dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块到该队列。

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

    一般来说系统本身会有3个队列。global_queue,current_queue,以及main_queue.

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

    1. #define DISPATCH_QUEUE_PRIORITY_HIGH     2  
    2. #define DISPATCH_QUEUE_PRIORITY_DEFAULT  0  
    3. #define DISPATCH_QUEUE_PRIORITY_LOW     (-2)  

    处理完事物后,需要将结果返回给或者是刷新UI主线程,同样,和上面一样,抓取主线程,程序块操作。


    展开全文
  • 类似object-c 中的GCD,如下代码,功能为刷新tableview;   DispatchQueue.main.async(execute: {  self.imageTableview.reloadData() })

    类似object-c 中的GCD,如下代码,功能为刷新tableview;

     

    DispatchQueue.main.async(execute: {

        self.imageTableview.reloadData()

    })

    展开全文
  • swift 线程更新UI

    2019-06-13 01:57:45
    为什么80%的码农都做不了架构师?>>> ...
    //1.全局-异步回调主线程(加优先级)
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
         dispatch_sync(dispatch_get_main_queue(),{
              // do something                       
         })
    })
    //2.全局异步回调(优先级)                            
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){
              // do something
    }
    //3.异步回调主线程
    dispatch_async(dispatch_get_main_queue(),{
              // do something
    }




    转载于:https://my.oschina.net/mycbb/blog/375826

    展开全文
  • iOS 主线程更新UI

    2016-06-16 09:58:34
    方法1:performSelectorOnMainThread [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO]; ...方法2:dispatch_async(dispatch_get_main_queue(), ^{ ......

    方法1performSelectorOnMainThread

    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];



    方法2dispatch_async(dispatch_get_main_queue(), ^{ ... })


    1. dispatch_async(dispatch_get_global_queue(0, 0), ^{  
    2.     // 处理耗时操作的代码块...  
    3.       
    4.     //通知主线程刷新  
    5.     dispatch_async(dispatch_get_main_queue(), ^{  
    6.         //回调或者说是通知主线程刷新,  
    7.     });  
    8.       
    9. });  

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



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

    一般来说系统本身会有3个队列。global_queuecurrent_queue,以及main_queue.

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

    [cpp] view plaincopy



    1. #define DISPATCH_QUEUE_PRIORITY_HIGH     2  
    2. #define DISPATCH_QUEUE_PRIORITY_DEFAULT  0  
    3. #define DISPATCH_QUEUE_PRIORITY_LOW     (-2)  

    处理完事物后,需要将结果返回给或者是刷新UI主线程,同样,和上面一样,抓取主线程,程序块操作。



    原因有2个:

    1、在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈 主线程无法获知,即无法更新
     
    2、只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的方法是开辟一个子线程,在子线程中对该按钮进行UI 更新是能及时的,如换标题,换背景图,但这没有任何意义
     

    1、程序一开始运行就进入了主线程
     
    2、处理某些数据太过费时,影响用户交互,可以开辟子线程处理,然后通知主线程进行界面更新
     
    测试代码:
     
    开辟一个多线程,直接在子线程里进行ui 更新:
     
    -(void)testUIRefresh:(UIButton *)button{

           [NSThread detachNewThreadSelector:@selector(beginTest) toTarget:self withObject:nil];

    }
     
    -(void)beginTest {
           NSLog(@” 当前线程  %@”,[NSThread currentThread]);

           NSLog(@” 主线程    %@”,[NSThread mainThread]);

          //该button 为  响应 testUIRefresh的button

           [self.button setTitle:@"AAA" forState:0];

    }
     

    2012-11-15 12:14:02.147 TestProj[2455:1b07]  当前线程  {name = (null), num = 3}
     
    2012-11-15 12:14:02.147 TestProj[2455:1b07]  主线程    {name = (null), num = 1}
     
    结果:当前的确是在子线程中,但是UI马上更新了??

    结果分析:大家都说UI更新在主线程中做,上面的结果怎么解释

    假设:如果在子线程里做了UI更新,待子线程运行完毕,程序自动进入 主线程进行指定的ui更新!

    问题:如果子线程没结束呢?

    在分线程中加入:
    -(void)beginTest{
          NSLog(@” 当前线程  %@”,[NSThread currentThread]);

          NSLog(@” 主线程    %@”,[NSThread mainThread]);

          //该button 为  响应 testUIRefresh的button

          [self.button setTitle:@"AAA" forState:0];

          [NSThread sleepForTimeInterval:4.0];

    }
     
    结果:

    self.button的title还是马上更新了

    结果分析:难道上面的假设不成立?

    问题:这次在分线程中add 一个button

    -(void)beginTest{

          NSLog(@” 当前线程  %@”,[NSThread currentThread]);

          NSLog(@” 主线程    %@”,[NSThread mainThread]);

          //该button 为  响应 testUIRefresh的button
          [self.button setTitle:@"AAA" forState:0];
          UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
          [backButton setTitle:@"测试runloop" forState:0];
          [backButton setTitleColor:[UIColor redColor] forState:0];
          backButton.frame = CGRectMake(100, 200, 100, 50);
          [backButton addTarget:self action:@selector(testRunLoop)   forControlEvents:UIControlEventTouchUpInside];
          [self.window addSubview:backButton];
          [NSThread sleepForTimeInterval:4.0];

     

    }
     
    结果:[self.button setTitle:@"AAA" forState:0];马上响应了,但是添加的这个Button却一直等到线程结束才绘制出来
     
    分析:在子线程中:如果要对其他UI 进行更新,则必须等到该子线程运行结束,而对响应用户点击的Button的UI更新则是及时的!不管他是在主线程还是在子线程中做的更新,意义都不大了,因为子线程中对所有其他ui更新都要等到该子线程生命周期结束才进行。
     
     
     
    结论:
     
    1、在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈 主线程无法获知,即无法更新
     
    2、只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的方法是开辟一个子线程,在子线程中对该按钮进行UI 更新是能及时的,如换标题,换背景图,但这没有任何意义


    展开全文
  • 1、在子线程中是不能进行UI更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。...
    
    

    原因有2个:

    1、在子线程中是不能进行UI更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈主线程无法获知,即无法更新
     
    2、只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的方法是开辟一个子线程,在子线程中对该按钮进行UI更新是能及时的,如换标题,换背景图,但这没有任何意义
     

    1、程序一开始运行就进入了主线程
     
    2、处理某些数据太过费时,影响用户交互,可以开辟子线程处理,然后通知主线程进行界面更新
     
    测试代码:
     
    开辟一个多线程,直接在子线程里进行ui 更新:
     
    -(void)testUIRefresh:(UIButton *)button{

          [NSThread detachNewThreadSelector:@selector(beginTest)toTarget:self withObject:nil];

    }
     
    -(void)beginTest {
          NSLog(@” 当前线程  %@”,[NSThreadcurrentThread]);

          NSLog(@” 主线程   %@”,[NSThreadmainThread]);

         //该button 为  响应 testUIRefresh的button

          [self.button setTitle:@"AAA" forState:0];

    }
     

    2012-11-15 12:14:02.147 TestProj[2455:1b07] 当前线程  {name = (null), num = 3}
     
    2012-11-15 12:14:02.147 TestProj[2455:1b07] 主线程    {name =(null), num = 1}
     
    结果:当前的确是在子线程中,但是UI马上更新了??

    结果分析:大家都说UI更新在主线程中做,上面的结果怎么解释

    假设:如果在子线程里做了UI更新,待子线程运行完毕,程序自动进入 主线程进行指定的ui更新!

    问题:如果子线程没结束呢?

    在分线程中加入:
    -(void)beginTest{
         NSLog(@” 当前线程  %@”,[NSThreadcurrentThread]);

         NSLog(@” 主线程   %@”,[NSThreadmainThread]);

         //该button 为  响应 testUIRefresh的button

         [self.button setTitle:@"AAA" forState:0];

         [NSThread sleepForTimeInterval:4.0];

    }
     
    结果:

    self.button的title还是马上更新了

    结果分析:难道上面的假设不成立?

    问题:这次在分线程中add 一个button

    -(void)beginTest{

         NSLog(@” 当前线程  %@”,[NSThreadcurrentThread]);

         NSLog(@” 主线程   %@”,[NSThreadmainThread]);

         //该button 为  响应 testUIRefresh的button
         [self.button setTitle:@"AAA" forState:0];
         UIButton *backButton = [UIButtonbuttonWithType:UIButtonTypeCustom];
         [backButton setTitle:@"测试runloop" forState:0];
         [backButton setTitleColor:[UIColor redColor] forState:0];
         backButton.frame = CGRectMake(100, 200, 100, 50);
         [backButton addTarget:selfaction:@selector(testRunLoop)   forControlEvents:UIControlEventTouchUpInside];
         [self.window addSubview:backButton];
         [NSThread sleepForTimeInterval:4.0];

    }
     


    结果:[self.button setTitle:@"AAA"forState:0];马上响应了,但是添加的这个Button却一直等到线程结束才绘制出来
     
    分析:在子线程中:如果要对其他UI进行更新,则必须等到该子线程运行结束,而对响应用户点击的Button的UI更新则是及时的!不管他是在主线程还是在子线程中做的更新,意义都不大了,因为子线程中对所有其他ui更新都要等到该子线程生命周期结束才进行。
     
     
     
    结论:
     
    1、在子线程中是不能进行UI更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈主线程无法获知,即无法更新
     
    2、只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的方法是开辟一个子线程,在子线程中对该按钮进行UI更新是能及时的,如换标题,换背景图,但这没有任何意义

    展开全文
  • http://blog.csdn.net/cordova/article/details/54933729简单说将代码同步到主线程执行的三种方法如下:// 1.NSThread [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO]; ...
  • iOS开发- reloadData无效 (子线程更新UI错误) 2014-10-13 0 个评论  收藏 我要投稿 今天在写一个聊天工具的时候遇到了一个问题。 注册的通知里面, 每当有其他用户发来消息的时候, UITableView
  • ODUIThreadGuard一个保安帮助你检查做UI更改是否不在主线程
  • 更新UI是必须回到主线程的,如果你是在网络请求的子线程中做操作,然后想更新UI的操作,那么需要把更新操作加入主队列,主队列的任务都是在主线程中执行的,这时需要用到GCD技术。 一般只需要这样写就可以 ...
  • Swift 系统学习 34 线程通信 Swift3.0 子线程下载图片主线程显示图片 Thread.detachNewThreadSelector(#selector(ViewController.downloadImage), toTarget: self, with: nil) // 线程间通信 self....
  • http://xuyafei.com/post/public/main-thread-checkerhttps://www.jianshu.com/p/c6ab011f449f在子程更新 UI 是一种常见的错误。这会引起 UI 更细失败、显示错误、数据损坏、甚至崩溃。Main Thread Checker Xcode9 ...
  • __weak __typeof(self) weakself= self; dispatch_async(dispatch_queue_create(0, 0), ^{ // 子线程执行任务(比如获取较大数据) dispatch_async(dispatch_get_main_queue(), ^{ ... // 通知主线程刷新 ...
  • 在开发应用程序时,我们异步请求数据处理后,需要回到主线程刷新UI,一般情况下直接通过以下方式异步回到主线程: dispatch_async(dispatch_get_main_queue(), ^{ // 主线程刷新UI操作 }); 看过SDWebImage...
  • 了解进程和线程的区别,在进行耗时操作遇到阻塞...官方建议:不要阻塞UI进程; 不要在UI进程之外的其他线程中,对视图当中的组件进行设置。 //经典异常 Only the original thread that created a view hierarchy can
  • 利用线程组请求多个网络, 等多个网络请求成功再回到主线程刷新UI 关键函数 dispatch_group_create() // 创建线程组 dispatch_group_enter // 进入线程组 dispatch_group_leave // 离开线程组 dispatch_group_notify ...
  • 写iOS的同学都知道,如果更新update UI不在主线程,直接crash。那到底为什么,update UI必须要在主线程呢?原因有如下3点: 1. 在Cocoa Touch, UIApplication建立在主线程,这个单例是App启动的第一部分。 所有在...
  • swift中的使用案例样式 // Mark: -数据源更新 typealias AddDataBlock = () ->Void var updataBlock:AddDataBlock? func loadLiveData(){ let grpup = DispatchGroup() grpup.enter() ...
1 2 3 4 5 ... 20
收藏数 2,008
精华内容 803