Swift学习笔记33-多线程与UI渲染

发布时间:2026/5/27 7:06:29

Swift学习笔记33-多线程与UI渲染 渲染UI的时候必须回到主线程通过**print(Thread.isMainThread)来得知是否现在主线程(这是基于foundation的**Thread.iscurrent也可以知道是在哪个线程。主线程的线程序号是1名字是main子线程是随机生成的没有名字。用这个方法来新建线程具体是哪条是系统随机分配的DispatchQueue.global().async{//一些代码}一个函数的执行顺序是先把自己的内容执行完然后按随机顺序执行其他线程的内容。需要用到这个model里的内容去刷新UI界面比如设置UI界面的文本或者图片所以在参数里用一个逃逸闭包把model传出去。注意这里的model最后是要用来渲染UI的所以必须在用回调传出model的时候回到主线程funcgetDetailRequest(block:escapingResponseBlock){letdic[sys_lan:1,result_str:INFJ]//把dic转成JSON再在URLRequest函数里使用letjsonStrdicValuesString(dicas[String:Any])print(jsonStr)//这里也有啊postRequest(jsonStr:jsonStr,url:RequestSimpleReport.simpleBaseUrl){[weakself]dicin// print (dic)ifletarrdicas?[DictionaryString,Any]{ifarr.count0{self?.responseBlock?(nil)return}else{letmodelSimpleReportModel.base(with:arr[0])DispatchQueue.main.async{block(model)}// print(model)}}}}用SwiftUI写一个组件然后在ViewController里设置它的大小和位置。需要用什么就把什么传进来。需要用到model把model传进来。importSwiftUIstructReportView:View{varmodel:SimpleReportModelvarbody:someView{Image(systemName:camera).frame(width:50,height:50)Text(model.result_str).font(.system(size:16)).foregroundColor(.blue)}}然后要用UIKit做底层也就是在UIViewController里把SwiftUI写好的View导入进去然后设置lazyvarreportView:UIHostingControllerReportView{letreportViewUIHostingController(rootView:ReportView(model:SimpleReportModel.empty()))reportView.view.frame.init(origin:.zero,size:self.view.frame.size)returnreportView}()lazy var reportView: UIHostingControllerReportView用于桥接SwiftUI和UIKit初始化reportViewUIHostingController是通过获取根视图来初始化的现在model里还没东西就随便传一个进去(这个model是没有值的所以必须传值。然后在需要显示的ViewController调用网络请求函数时把从网络上请求到的model传给reportView的rootView就可以使用model渲染页面了。就像这样

相关新闻