iOS 回到主线程刷新UI

在iOS 里面,项目打开就会运行一个主线程,所有的UI都在主线程里进行.其他网络请求或者耗时操作理论上也可以在主线程运行,但是如果太耗时,那么就会影响主线程其他UI.所以需要开字线程来进行耗时操作,子线程进行完耗时操作之后,如果项目需求有需要刷新UI,或者改变UI,一定得回到主线程进行修改/刷新.

下面介绍三种iOS里线程模式

前情提要:在View上创建一个UILabel, 点击屏幕空白处开启一个子线程,在子线程里模拟耗时操作,耗时操作完毕后需要改变UILabel上的文字.

- (void)viewDidLoad 
{
    [super viewDidLoad];
 
    self.markLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, 200, 300, 40)];
    self.markLabel.backgroundColor = [UIColor greenColor];
    self.markLabel.textAlignment = NSTextAlignmentCenter;
    self.markLabel.text = @"子线程开启之前的String";
    [self.view addSubview:self.markLabel];
}

1.NSThread

1.1. 点击空白页面,开启线程(先模拟不在主线程刷新UI的错误写法)

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //模拟线程耗时操作,并在耗时操作后改变label的String
    
    [self threadModel];
}


- (void)threadModel
{
    NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadUpdateUI) object:nil];
    [thread start];
}

- (void)threadUpdateUI
{
    //模拟耗时操作
    [NSThread sleepForTimeInterval:2];

     //耗时操作后直接刷新UI (这是模拟错误的方法)
     self.markLabel.text = @"修改后的Sting"; 
}

按照以上的写法,直接报错,报错提示如下图所示: 

must be used from main thread only : 一定且只有从主线程刷新

因此可知,需要进入主线程去刷新,那么NSTread模式怎么进入主线程呢? 看下面的代码

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //模拟线程耗时操作,并在耗时操作后改变label的String
    
    [self threadModel];
}

- (void)threadModel
{
    NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadUpdateUI) object:nil];
    [thread start];
}

- (void)threadUpdateUI
{
    //模拟耗时操作
    [NSThread sleepForTimeInterval:2];
    //NSThread 找到主线程
    [self performSelectorOnMainThread:@selector(uodateMainUI) withObject:nil waitUntilDone:NO];
    
}

- (void)uodateMainUI
{
    self.markLabel.text = @"修改后的Sting";
}

以上是NSThread 找到主线程,并且刷新UI的方法.

接下来介绍CGD和NSOperation 找到主线程的方法

2.CGD

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //模拟线程耗时操作,并在耗时操作后改变label的String
    
    [self CGDModel];
}

- (void)CGDModel
{
    //队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    /*
     我这里使用global_queue来模拟,你也可以使用并发队列/串行队列模拟
     dispatch_queue_t queue = dispatch_queue_create(@"并发队列", DISPATCH_QUEUE_CONCURRENT);
     dispatch_queue_t queue = dispatch_queue_create(@"串行队列", DISPATCH_QUEUE_SERIAL);
     但是不能用主队列来模拟,因为主队列本身就有主线程
     */
    
    //任务
    dispatch_async(queue, ^{
        
        //模拟耗时操作
        [NSThread sleepForTimeInterval:2];
        
        //CGD模式回到主线程,因为CGD和NSOperation只有任务和队列的概念,所以主队列就是主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            self.markLabel.text = @"修改后的Sting";
        });
        
    });
}

3.NSOperation

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //模拟线程耗时操作,并在耗时操作后改变label的String
    [self operationModel];
}

- (void)operationModel
{
    //队列
    NSOperationQueue * queue = [[NSOperationQueue alloc]init];
    //任务
    [queue addOperationWithBlock:^{
        
        //模拟耗时操作
        [NSThread sleepForTimeInterval:2];
        
        //找到主队列(NSOperation只有任务和队列的概念,所以主队列就是主线程)
        [NSOperationQueue.mainQueue addOperationWithBlock:^{
                 
            self.markLabel.text = @"修改后的Sting";
        }];
    
    }];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896001.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音频/视频提取器:Python和moviepy实现

在这篇博客中,我们将深入探讨一个使用Python和wxPython构建的音频/视频提取器应用程序。这个应用程序允许用户从视频文件中提取音频,或者从音频文件中截取特定时间段。让我们逐步分析这个程序的功能和实现。 C:\pythoncode\new\MP3towav.py 全部代码 import wx import os imp…

「iOS」——YYModel学习

iOS学习 前言优势使用方法简单的Model与JSON互转多样化的数据类型交换容器类数据交换 model中包含其他model白名单与黑名单 总结 前言 YYModel是YYKit的高效组件之一&#xff0c;在实际场景中的非常实用&#xff0c;在项目中使用MVC架构时&#xff0c;可以简化数据处理。在性能…

OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇

《OpenShift 4.x HOL教程汇总》 说明&#xff1a; 本文主要说明能够云原生备份容灾的开源项目 Velero 及其红帽扩展项目 OADP 的概念和架构篇。操作篇见《OpenShift 4 - 使用 OADP 对容器应用进行备份和恢复&#xff08;附视频&#xff09; 》 Velero 和 OADP 包含的功能和模…

028.爬虫浏览器-抓取shadowRoot下的内容

一、什么是Shadow DOM Shadow DOM是一种在web开发中用于封装HTML标记、样式和行为的技术&#xff0c;以避免组件间的样式和脚本冲突。它允许开发者将网页的一部分隐藏在一个独立的作用域内&#xff0c;从而实现更加模块化和可维护的代码结构 二、js操作Shadow DOM // 获取宿…

邮件营销文案设计:打造个性化内容的步骤?

邮件营销文案写作技巧与方法&#xff1f;外贸邮件营销怎么撰写&#xff1f; 一个成功的邮件营销文案设计不仅能吸引客户的注意力&#xff0c;还能有效提升转化率。MailBing将详细探讨如何通过一系列步骤&#xff0c;打造出既个性化又高效的邮件营销文案设计。 邮件营销文案设…

监控易监测对象及指标之:Microsoft Message Queue(MSMQ)监控

监控易是一款强大的监控工具&#xff0c;能够实时监控各类IT设施和应用程序的性能指标。对于Microsoft Message Queue&#xff08;简称MSMQ&#xff09;的监控&#xff0c;监控易提供了详尽的指标&#xff0c;以确保企业能够准确掌握消息队列的运行状况。 在MSMQ的监控中&#…

24、darkhole_2

难度 高&#xff08;个人感觉属于中&#xff09; 目标 root权限2个flag 基于VMware启动&#xff08;我这里启动只能选择我wifi的那个网卡才能获取到ip地址&#xff0c;nat的没获取到不知道为什么。&#xff09; kali 192.168.1.122 靶机 192.168.1.170 信息收集 端口扫描 只开…

【python】OpenCV—Fun Mirrors

文章目录 1、准备工作2、原理介绍3、代码实现4、效果展示5、参考 1、准备工作 pip install vacm2、原理介绍 在OpenCV中&#xff0c;VCAM 库是一个用于简化创建三维曲面、定义虚拟摄像机、设置参数以及进行投影任务的工具。它特别适用于实现如哈哈镜等图像变形效果。 一、VC…

用你的手机/电脑运行文生图方案

随着ChatGPT和Stable Diffusion的发布&#xff0c;最近一两年&#xff0c;生成式AI已经火爆全球&#xff0c;已然成为移动互联网后一个重要的“风口”。就图片/视频生成领域来说&#xff0c;Stable Diffusion模型发挥着极其重要的作用。由于Stable Diffusion模型参数量是10亿参…

读者写者问题与读写锁

读者写者问题 读者写者 vs 生产消费 重点是有什么区别 读者写者问题如何理解 重点理解读者和写者如何完成同步 下面是一段伪代码&#xff1a;公共部分 uint32_t reader_count 0; lock_t count_lock; lock_t writer_lock; Reader // 加锁 lock(count_lock); if(reader_c…

Java | Leetcode Java题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution {public int[] constructRectangle(int area) {int w (int) Math.sqrt(area);while (area % w ! 0) {--w;}return new int[]{area / w, w};} }

5G物联网主机引领企业数字化转型

在当今这个信息化高度发展的时代&#xff0c;企业的竞争力很大程度上取决于其能否快速适应市场变化并高效地进行内部管理。郑州龙兴物联科技有限公司凭借其先进的5G物联网技术&#xff0c;推出了为企业量身定制的5G物联网主机&#xff0c;该设备充分利用其多协议、多接口的特点…

ESP32-C3 入门笔记04:gpio_key 按键 (ESP-IDF + VSCode)

1.GPIO简介 ESP32-C3是QFN32封装&#xff0c;GPIO引脚一共有22个&#xff0c;从GPIO0到GPIO21。 理论上&#xff0c;所有的IO都可以复用为任何外设功能&#xff0c;但有些引脚用作连接芯片内部FLASH或者外部FLASH功能时&#xff0c;官方不建议用作其它用途。 通过开发板的原…

【Vue】Vue3.0 (十二)、watchEffect 和watch的区别及使用

上篇文章&#xff1a; 【Vue】Vue3.0 &#xff08;十二&#xff09;、watch对ref定义的基本类型、对象类型&#xff1b;reactive定义的对象类型的监视使用 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&…

数据仓库基础概念

数据仓库 概念 数据仓库&#xff08;Data Warehouse, DW&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合。它是为满足企业决策分析需求而设计的。 面向主题&#xff1a;数据仓库围绕特定的主题组织数据&#xff0c;例如“销售”或“人力资源”&am…

线上交友小程序源码系统 一元盲盒小程序在线开好友 带完整的安装代码包以及搭建部署教程

系统概述 线上交友小程序源码系统是基于先进的技术架构开发的一套完整的解决方案&#xff0c;旨在为用户提供一个便捷、有趣的线上交友平台。该系统通过一元盲盒的形式&#xff0c;让用户在未知中寻找惊喜&#xff0c;增加了交友的趣味性和神秘感。 该系统采用了先进的编程技…

UE5蓝图中忽略触发区域进行碰撞

Event Hit :只会在碰撞到实体的时候产生碰撞。如果是触发区域则会忽略。 Destroy Actor&#xff1a;销毁自身。

openrtp 音视频时间戳问题

解决音视频发送的rtp问题 openrtp增加了音频aac的发送&#xff0c;地址 OpenRTP Gitee开源地址 同时使用两个rtp &#xff0c;来发送音频和视频 使用以下音频rtp&#xff0c;是可以发送和接收的&#xff0c;音频端口在视频端口上2 v0 o- 0 0 IN IP4 127.0.0.1 sMy Stream cI…

sentinel dashboard分布式改造落地设计实现解释(二)-分布式discovery组件

discovery discovery负责维护app/机器资料库&#xff0c;transport健康检测&#xff0c; transport上下线处理。discovery关键是分布式存储&#xff0c;后续研究一下raft&#xff0c;其复制&#xff0c;状态机&#xff0c;快照技术&#xff0c;但个人觉得&#xff0c;discover…

【网络安全】护网蓝队之应急响应

蓝队技术栈 Linux入侵排查 系统排查 一、查看历史命令 在Linux系统中&#xff0c;检查历史命令记录是安全审计的重要步骤之一&#xff0c;它可以帮助您了解系统上用户&#xff08;包括潜在的黑客&#xff09;的活动。以下是对您描述的重新表述和补充&#xff1a; 检查历史命…