首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

应该只从主线程中调用[table reloaddata]吗?

关于这个问题,我们需要先了解一下主线程和子线程的概念。在iOS应用开发中,主线程是应用程序的主要执行线程,负责处理用户界面的更新和事件响应等任务。而子线程则是由主线程创建的,用于执行耗时的操作,以免阻塞主线程导致用户界面无法正常刷新。

在iOS应用开发中,我们通常不建议在主线程中直接调用table reloaddata,因为这个方法可能会导致用户界面出现卡顿或者延迟刷新的情况。相反,我们建议在子线程中执行耗时的操作,然后在主线程中更新用户界面。

具体来说,我们可以使用GCD(Grand Central Dispatch)来创建子线程,并在子线程中执行耗时的操作。当操作完成后,我们可以使用GCD将结果回调到主线程中,然后在主线程中调用table reloaddata来更新用户界面。

以下是一个简单的示例代码:

代码语言:txt
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 在子线程中执行耗时的操作
    // ...

    // 将结果回调到主线程中
    dispatch_async(dispatch_get_main_queue(), ^{
        [table reloaddata];
    });
});

这样做可以确保用户界面的流畅性,提高用户体验。同时,也可以避免因为主线程中的耗时操作而导致的程序崩溃或者卡顿问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS 开发:『Runtime』详解(二)Method Swizzling

应该在 +load 执行 Method Swizzling。 程序在启动的时候,会先加载所有的类,这时会调用每个类的 +load 方法。而且在整个程序运行周期只会调用一次(不包括外部显示调用)。...Method Swizzling 应该总是在 dispatch_once 执行。...Method Swizzling 不是原子操作,dispatch_once 可以保证即使在不同的线程也能确保代码执行一次。...所以,在使用 Method Swizzling 的时候,应该保持足够的谨慎。 例如,你在一个类重写一个方法,并且不调用 super 方法,则可能会出现问题。...+ load 方法的调用规则为: 先调用类,按照编译顺序,顺序地根据继承关系由父类向子类调用; 再调用分类,按照编译顺序,依次调用; + load 方法除非主动调用,否则只会调用一次。

1.9K31

RunLoop数据结构、RunLoop的实现机制、RunLoop的Mode、RunLoop与NSTimer和线程

需要手动唤醒线程,将当前线程内核态切换到用户态 source1: 基于port的,包含一个 mach_port 和一个回调,可监听系统端口和通过内核和其他线程发送的消息,能主动唤醒RunLoop,...因为RunLoop负责分发源的消息。如果线程当前正在处理繁重的任务,就有可能导致Timer本次延时,或者少执行一次)。...Mode,且每次调用 RunLoop 的函数时,只能指定其中一个 Mode(CurrentMode)。...6、通知观察者线程即将进入休眠状态。 7、将线程置于休眠状态,由用户态切换到内核态,直到下面的任一事件发生才唤醒线程。 一个基于 port 的Source1 的事件(图里应该是source0)。...1、为当前线程开启一个RunLoop(第一次调用 [NSRunLoop currentRunLoop]方法时实际是会先去创建一个RunLoop) 1、向当前RunLoop添加一个Port/Source

63240
  • iOS面试题:RunLoop剖析

    需要手动唤醒线程,将当前线程内核态切换到用户态 source1: 基于port的,包含一个 mach_port 和一个回调,可监听系统端口和通过内核和其他线程发送的消息,能主动唤醒RunLoop,接收分发系统事件...因为RunLoop负责分发源的消息。如果线程当前正在处理繁重的任务,就有可能导致Timer本次延时,或者少执行一次)。...Mode,且每次调用 RunLoop 的函数时,只能指定其中一个 Mode(CurrentMode)。...6、通知观察者线程即将进入休眠状态。 7、将线程置于休眠状态,由用户态切换到内核态,直到下面的任一事件发生才唤醒线程。 一个基于 port 的Source1 的事件(图里应该是source0)。...1、为当前线程开启一个RunLoop(第一次调用 NSRunLoop currentRunLoop方法时实际是会先去创建一个RunLoop) 1、向当前RunLoop添加一个Port/Source等维持

    84220

    【iOS 开发】tableView updates 对比 reloadData

    鉴于我这里进行了一次 insert 操作,把这两条语句去掉也没事,但是出于规范还是应该写上,因为假如习惯不写,下面这样的代码会运行时崩溃: @IBAction func update(_ sender...总结 numberOfRows 方法调用: 都调用一次 numberOfRows 方法 cellForRow 方法调用次数: reloadData 会为当前显示的所有cell调用这个方法,updates...只会为新增的cell调用这个方法 cellForRow 方法调用时间: reloadData 会在 numberOfRows 方法调用后的某一时间异步调用 cellForRow 方法,updates...会在 numberOfRows 方法调用后马上调用 cellForRow 方法 reloadData 方法缺陷: 带来额外的不必要开销,缺乏动画 updates 方法缺陷:deleteRows 不会调用...cellForRow 方法,可能导致显示结果与数据源不一致;需要手动保证 insertRows、deleteRows 之后,row 的数量与 numberOfRows 的结果一致,否则会运行时崩溃 ---- 部分文章没有写

    1.8K30

    教你写个多表视图

    把当前的控制器作为一个父控制器,添加三个UITableViewController的实例作为子控制器,把父控制器的 scrollView 作为容器,然后添加子控制器的 tableView 作为子视图...解决的办法是可以自己写个重用机制,不过这显然没必要,用自带重用机制的UICollectionView应该是个更好的选择。...显然是在HomeContainerViewController: let tableViewDataList = ["first table", "second table", "third table...这边 cell 是会被复用的,在翻到第三页时,会复用第一页的 cell ,第四页复用第二页的 cell……依此类推,所以需要给 cell 的tableView调用 reloadData方法,不然就算改变了表的数据...这样就完成了一个多表视图,实际项目一般会在 table 上方放个小滑块指示器什么的,也很简单,只要在cellForItemAtIndexPath方法根据indexPath.section来设置滑块位置就好了

    1.3K30

    ·FMDB:第三方数据库处理框架·用法示例篇(附源码Demo)

    笔者曾查阅过FMDB示例用法的一些文献,一部分有的讲到FMDatabase类,另一部分讲专为多线程操作的FMDatabaseQueue类,很少有同时介绍两者用法区别的文章。这里,笔者做一个尝试。...而关于FMDatabaseQueue,官方文档说:如果你想在多线程执行多个查询或更新,你应该使用该类。这是线程安全的。 然而,你看完还是不知道FMDatabaseQueue是什么。...那还需要自己另外建一个DataBase?其实FMDatabaseQueue这个类的对象已经把一个数据库和有关事务操作的方法封装在一起了。...DEMO代码也是这样做的。...@property(nonatomic,copy) NSString *brand; @property(nonatomic,assign) NSInteger price; @end 1.3 调用

    98620

    剑指offer Java_工程图学基础知识点总结

    若不等,调用addEntry()将新创建一个元素添加到table。创建元素entity时,要判断table的填充容量是否大于负载因子0.75,若大于就要扩容,容量扩充到两倍。...解决方法2:volatile变量每次被线程访问时,都强迫线程内存重新取该变量的最新值到工作内存,而当该变量发生修改变化时,也会强迫线程将最新的值刷新会到内存。...设计一个动态大小的线程池,如何设计,应该有哪些方法?...所有的变量都存储在内存。 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(内存该变量的一份拷贝)。...Java内存模型的两条规定: 线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接内存读写; 不同线程无法直接访问其他线程工作内存的变量,线程间变量值的访问都需要通过内存来完成。

    37920

    MySQL的复制(5.0.x版)part

    服务器然后记录这个值到master.info文件。下次启动服务器时,它服务器的master.info文件读取master host值并忽略选项文件的值。...--master-connect-retry=seconds 在服务器宕机或连接丢失的情况下,服务器线程重新尝试连接服务器之前睡眠的秒数。如果服务器.info文件的值可以读取则优先使用。...如果服务器.info文件的值可以读取则优先使用。 l --master-user=user_name 连接服务器时服务器线程用于认证的账户的用户名。...服务器主机硬盘空间有限时很有用。达到限制后,I/O线程停止服务器读取二进制日志的事件,直到SQL线程被闭锁并且删除了部分未使用的中继日志。...例如:--replicate-wild-do-table=foo%.bar%复制数据库名以foo开始和表名以bar开始的表的更新。 要想在数据库或表名模式包括通配符,用反斜线对它们进行转义。

    50510

    【MySQL】线程状态详解

    converting HEAP to ondisk 该线程正在将内部临时表 MEMORY表转换为磁盘表。 copy to tmp table 线程正在处理一个 ALTER TABLE语句。...deletingfrommain table 服务器正在执行多表删除的第一部分。它仅从第一个表删除,并保存用于其他(引用)表删除的列和偏移量。...对于 end状态,可能会发生以下操作: 删除表的数据后删除查询缓存条目 将事件写入二进制日志 释放内存缓冲区,包括blob Killed 有人 KILL 向线程发送了一个语句,它应该在下次检查...在MySQL的每个循环中检查该标志,但在某些情况下,线程可能仍然需要很短的时间才能死掉。如果线程被某个其他线程锁定,则一旦另一个线程释放其锁定,kill就会生效。...Sendingto clientMySQL 5.7.8开始调用此状态。

    2.2K30

    cell高度的缓存1——利用字典进行缓存

    版权声明:本文为博原创文章,未经博允许不得转载。...return cellHeight; } 上面的代码虽然能计算出cell的高度实现想要的效果,可会有一个耗性能的问题:即使之前计算过某个cell的高度,在这个cell在此展示出来的时候还会再次调用...在这种情况下,我们应该将之前计算出的cell高度进行缓存,下次这些cell要再次展示的时候就从缓存获取之前计算出的cell高度,而不用进行多余的计算操作。...self.dataSource[indexPath.row]; CGFloat cellHeight = [self.cellHeightDic[model.description] floatValue];    // 字典取出...tableview执行reloadData之后将存储cell高度的字典清空以防字典的数据越来越多。

    52810

    Windows服务框架与服务的编写

    下面几个方面详细说明服务程序的基本框架 服务程序的框架 服务程序本身也是依附在exe或者dll文件,一般一个普通的可执行文件可以包含一个或者多个服务,但是为了代码的维护性,一般一个程序总是包含一个服务...立即调用StartServiceCtrlDispatchar函数把进程的主线程连接到ServiceControlManager的函数 2....综合上面的内容,可以看到一个服务程序应该是至少涉及到3个线程,进程的主线程,服务线程,控制分发线程,RegisterServiceCtrlHandler(Ex)的原型如下: SERVICE_STATUS_HANDLE...将所有的控制都列举出来,针对不同的控制调用的对应的处理函数,并且这些函数都是虚函数,所以在派生类需要处理某个控制消息就重写某个对应的函数即可。...在函数调用CFSZService::RegisterService();函数将之前我们通过一组BEGIN_SERVICE_MAP、ON_SERVICE_MAP、END_SERVICE_MAP组成的映射关系注册到系统的服务控制管理器

    1.5K11

    【IOS开发基础系列】Table View开发专题

    而且必须在父类TableCell的直接继续类调用才起作用 2.4.1.3 减少视图的数目。        ...A函数调用UIGraphicsGetImageFromCurrentImageContext(在C函数)生成UIImage,然后传递给B函数去处理,这样内存会暴涨。...现在将C函数调用生成UIImage放到B函数中生成并使用,这样就能得到及时释放。 2.4.1.6 不要阻塞主线程。        ...出现这种现象的原因就是主线程执行了耗时很长的函数或方法,在其执行完毕前,无法绘制屏幕和响应用户请求。其中最常见的就是网络请求了,它通常都需要花费数秒的时间,而你不应该让用户等待那么久。...而换成reloadData方法的话,瞬间就处理完了。

    35820

    你想要的WebAssembly入门与实践

    Node.js可以直接运行C# C++代码? 当然不可以,只能调用操作系统能力,或者+中间层或者其他方式调用。 浏览器可以运行 C++代码,rust?...回收300MB,需要1S还是多久,忘记了,去年做过实验 那么浏览器,这种调用webAssembly模块的情况下,理论上如果webAssembly模块被阻塞了,那么JS解析线程也是会阻塞的。...可是我在国外网站上看到的内容是说: 每个WebAssembly线程都在Web Worker运行,相当于跟JS解析线程是分开的,不会阻塞JS主线程的解析 最近看到又新引入的 SharedArrayBuffer...和原子操作使开发人员能跨多个线程使用共享的内存了。...imports.env.table) { // 在 MVP 版本 element 只能是 "anyfunc" imports.env.table = new WebAssembly.Table

    2.7K20
    领券