CoreData应用UI活动指示器不显示的解决
来源:互联网 发布:破解windows开机密码 编辑:程序博客网 时间:2024/05/22 10:55
一只简单的CoreData应用,UI界面左上角按钮触发一段耗时的代码,App本意是在执行耗时代码时将按钮暂时变为一个活动指示器,等到代码运行完毕再恢复原来的按钮.但是App运行时活动指示器从未显示过!
这是一个典型的主线程阻塞的情况,因为添加活动指示器是一个UI操作,所以它会被耗时操作阻塞,它会被执行,但没有效果(或者说结果未定义,在这里就是没有效果):
func handle(){ navigationItem.leftBarButtonItem = activityIndicatorBarButtonItem()//耗时的CoreData操作self.navigationItem.leftBarButtonItem = self.exportBarButtonItem()}
我们下意识的做法是将耗时操作放到非main队列中去,like this:
func handle(){ navigationItem.leftBarButtonItem = activityIndicatorBarButtonItem() DispatchQueue.global().async { //耗时的CoreData操作 DispatchQueue.main.async{ self.navigationItem.leftBarButtonItem = self.exportBarButtonItem() } }}
这样执行下来貌似没有问题,但实际上你在私有queue执行的context没有跨线程的安全性!
来看一下我们是如何创建context对象的:
lazy var context: NSManagedObjectContext = { var managedObjectContext = NSManagedObjectContext( concurrencyType: .mainQueueConcurrencyType) managedObjectContext.persistentStoreCoordinator = self.psc return managedObjectContext }()
注意我们使用的选项是在main队列上的并发!
这就是私有context的用途了,我们可以临时创建一个在私有队列上运行的context来解决此问题:
func handle(){ navigationItem.leftBarButtonItem = activityIndicatorBarButtonItem() let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) privateContext.persistentStoreCoordinator = coreDataStack.context.persistentStoreCoordinator privateContext.perform { //耗时的CoreData代码 DispatchQueue.main.async{ self.navigationItem.leftBarButtonItem = self.exportBarButtonItem() } }}
0 0
- CoreData应用UI活动指示器不显示的解决
- UI组件:ActiveIndicator活动指示器
- IOS开发UI基础:活动指示器
- XMG 活动指示器的制作
- Xamarin XAML语言教程Xamarin.Forms中活动指示器的显示隐藏
- 索引指示器的应用
- 索引指示器的应用
- ViewPagerIndicator的指示器应用
- 【初学】UI控件学习笔记-UIActivityIndicatorView活动指示器
- 手机应用Toast不显示问题的解决
- SwipeRefreshLayout.setRefresh(true)指示器不显示
- C#索引指示器的应用
- 仿米UI的ViewPagerIndicator ViewPager指示器
- UIActivityIndicatorView活动指示器
- UIActivityIndicatorView-----------活动指示器
- UIActivityIndicatorView 活动指示器
- UIActivityIndicatorView活动指示器
- UIActivityIndicatorView活动指示器
- 网络编程(54)—— Windows下使用WSASocket基于事件进行IO重叠
- LLVM后端开发
- uoj #86 mx的组合数 FFT 原根
- 基于Spring的扩展Schema配置
- 数组,vector,map,list,queue区别
- CoreData应用UI活动指示器不显示的解决
- P1141 01迷宫
- Leetcode_005_Longest_Palindromic_Substring
- 《DSAA》 12.1 自顶向下伸展树
- 【LeetCode】 167. Two Sum II - Input array is sorted
- 跨域请求
- 389. Find the Difference
- 查看端口被占用
- Oracle数据库之数据处理