美文网首页
主线程阻塞问题

主线程阻塞问题

作者: 愤怒小鸟飞呀飞 | 来源:发表于2018-10-23 10:53 被阅读0次

问题

主线程阻塞会导致新添加在父视图的view不能及时显示。

如下代码:

-(void)saveButtonAction:(UIButton *)button
{
[SVProgressHUD showWithStatus:@"保存中。。。" maskType:SVProgressHUDMaskTypeClear];
int m = 0 ;
while (m < 100)
{
m++ ;
NSLog(@"test");
}
}
上述代码中,SVProgressHUD 将不会显示,直到 saveButtonAction 方法执行结束

解决办法
使用GCD异步执行,把需要执行的耗时操作,通过串行队列的方式添加到主线程队列,让主线程有时间的时候在执行
如下代码:

-(void)saveButtonAction:(UIButton *)button
{
[SVProgressHUD showWithStatus:@"保存中。。。" maskType:SVProgressHUDMaskTypeClear];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *image = [self getCapture];
[self saveImageToPhotos:image];
});
}

  • (void)saveImageToPhotos:(UIImage*)savedImage
    {
    UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    }

// 指定回调方法

  • (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
    {
    NSString *msg = nil ;
    if(error != NULL){
    msg = @"保存图片失败" ;
    [SVProgressHUD showErrorWithStatus:msg];
    }else{
    msg = @"保存图片成功" ;
    [SVProgressHUD showSuccessWithStatus:msg];
    if ([self.delegate respondsToSelector:@selector(saveButtonActionComplete:)])
    {
    [self.delegate saveButtonActionComplete:self];
    }
    }
    }

  • (UIImage)getCapture
    {
    UIImage
    viewImage = nil;
    UICollectionView *scrollView = _collectionView;
    UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, scrollView.opaque, 0.0);
    {
    CGPoint savedContentOffset = scrollView.contentOffset;
    CGRect savedFrame = scrollView.frame;

      scrollView.contentOffset = CGPointZero;
      scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
      [scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
      viewImage = UIGraphicsGetImageFromCurrentImageContext();
      
      scrollView.contentOffset = savedContentOffset;
      scrollView.frame = savedFrame;
    

    }
    UIGraphicsEndImageContext();
    return viewImage;
    }

相关文章

  • NSTimer

    一.线程阻塞问题 1.主线程 (1) NSRunLoopMode : NSDefaultRunLoopMode 控...

  • iOS开发多线程--线程状态

    线程简介 线程创建 线程的开启: 线程的运行和阻塞:(1)设置线程阻塞1,阻塞2秒 (2)第二种设置线程阻塞2,以...

  • netty(四)nio之网络编程

    一、阻塞与非阻塞 1.1 阻塞 1.1.1 阻塞模式会存在哪些问题? 1)在阻塞模式下,以下的方法都会导致线程暂停...

  • quartz线程阻塞问题

    quartz blocked 现象-所有quartz的job(Hour/Minute等失去作用 无相关任何log输...

  • 主线程阻塞问题

    问题 主线程阻塞会导致新添加在父视图的view不能及时显示。 如下代码: -(void)saveButtonAct...

  • 关于高并发的一些思考

    1.问题 1、什么是线程的交互方式? 2、如何区分线程的同步/异步,阻塞/非阻塞? 3、什么是线程安全,如何做到线...

  • iOS 多线程问题

    目录多线程简介iOS多线程NSThread解决线程阻塞问题多个线程并发线程状态扩展--NSObject分类扩展方法...

  • Java基础面试高频问答题

    1、什么导致线程阻塞 一般线程中的阻塞: Socket客户端的阻塞: Socket服务器的阻塞: 什么导致线程阻塞...

  • Android 多线程之阻塞队列

    Android 多线程系列 Android 多线程之几个基本问题 Android多线程之常见的线程形态 阻塞队列 ...

  • IJKSDLGLView fix xcode 10.2.1 Ma

    IJKPlayer首次打开阻塞主线程问题解决#4739

网友评论

      本文标题:主线程阻塞问题

      本文链接:https://www.haomeiwen.com/subject/juvozftx.html