image.png 在iOS开发实际中,可以在 AppDelegate.m 的 didFinishLaunchingWithOptions方法中,快速定位需要当前需要开发的控制器 但是,如果要开发的控制器...image.png ==> 解决办法 : 方法1:不设置rootVC = 当前开发控制器(TwoVC),默认使用homeVC,一步一步点击,似魔鬼的步伐一般进入TwoVC 方法2 :还是设置rootVC...= 当前的开发控制器(TwoVC),同时,使用数据持久化保存,保存OneVC传过来的数据,然后从硬盘中读取 模型数据存储 1....在实际开发中的使用流程 默认正常的rootVC = homeVC,走正常的 homeVC -> OneVC -> TwoVC流程 在要进行操作的控制器TwoVC中,添加判断 TwoVC.m中...),因为_productModel没数据,就必须从MNCacheClass中读取 _productModel = [MNCacheClass mn_getSaveModelWithkey
温故知新 我们回顾一下mybatis的Mapper的注册与绑定过程,我之前也写过一篇「Mybatis源码分析之Mapper注册与绑定」,在这篇文章中,我详细地讲解了Mapper绑定的最终目的是将xml或者注解上的...包含了Mapper操作SqlSession所有的细节,因此我们就可以直接使用Mapper的方法就可以跟SqlSession进行交互。...源码分析 从Mapper的注册与绑定过程的时序图看,要想将sql注入器无缝链接地添加到mybatis里面,那就得从Mapper注册步骤添加,果然,mp很鸡贼地继承了MapperRegistry这个类然后重写了...这个方法是先从全局缓存类中获取自定义的sql注入器,如果在GlobalConfiguration中没有找到自定义sql注入器,就会设置一个mp默认的sql注入器AutoSqlInjector。...再根据table和sql信息创建一个SqlSource对象。
在JetPack架构中,ViewModel组件是一个可以感知生命周期的形式来存储和管理视图相关的数据的组件,因此它适合以下场景。 适合需要保存大量数据的场景。...例如,对于需要保存小量数据的场景,我们可以使用Activity/ Fragment的onSaveInstanceState方法保存数据,然后在onCreate方法中利用onRestoreInstanceState...二、生命周期 我们知道,Android的Activity/Fragment是有生命周期的,我们可以在不同的生命周期函数中执行不同的操作来达到不同的目的。...然后,我们在Activity中就可以使用MyViewModel,如下所示。...,ViewModel会将数据存储在 NonConfigurationInstances 对象中,而NonConfigurationInstances是定义在Activity里面的一个类,如下所示。
,然后在 activity 实例化并且赋值。...源码分析 在分析源码之前,应该思考一下,如果这个功能由你来写,你会是怎么实现,用什么数据结构去存数据,然后根据这个功能,可以拓展出什么其他用途。 首先看创建方法。...ViewModelProviders 的 of 方法可以传入 fragment 或者是 activity,就是说你可以在fragment 或者 activity 创建 viewmodel,而这个 viewmodel...可以创建多个 viewmodel,而 activity 和 fragment 中 holderfragment 只有一个。...ps:在 RxPermissions 中也用到setRetainInstance这个属性。
对于简单的数据,Activity 可以使用 onSaveInstanceState() 方法保存 然后从 onCreate() 中的Bundle恢复数据,但此方法仅适合可以序列化再反序列化的少量数据(IPC...二、ViewModel使用 2.1 基本使用 了解了ViewModel作用解特点,下面来看看如何结合LivaData使用的。(gradle依赖在第一篇中已经介绍过了。)...假设有一个ListFragment,用户从列表中选择一项,会有另一个DetailFragment显示选定项的详情内容。在之前 你可能会定义接口或者使用EventBus来实现数据的传递共享。...如果其中一个 Fragment 消失,另一个 Fragment 将继续照常工作。 每个 Fragment 都有自己的生命周期,而不受另一个 Fragment 的生命周期的影响。...并且可以看到LiveData和ViewModel搭配使用,可以代替MVP中的Presenter解决很多问题。ViewModel是我们后续建立MVVM架构的重要组件。这也是我们必须掌握和理解的部分。
下面可以看到一个菜鸟的进化史哦。赶紧围观吧。...字典转模型在我还是菜鸟的时候,说实话,老老实实在模型里面写的如下代码 1.手动解析 //手动解析 - (instancetype)initWithDic { self = [super init...我想每个人从开始接触iOS开发到现在都会有一个进化的过程。就这样写了很久直到我走出那家公司,去其他公司面试,被虐的体无完肤。各种炫酷装逼底层层出不穷,面试是一种成长的机会,我是这么认为的。...听说最近面试对于RunTime问的比较的火,说实话,我对于底层的东西学的很烂,因为实际应用当中很少用到,学着学着过断时间也会忘记。网上的资料也很多,我也来凑下热闹?...:遍历模型中所有成员属性,去字典中查找 // 属性定义在哪,定义在类,类里面有个属性列表(数组) // 遍历模型所有成员属性 // ivar:成员属性 // class_copyIvarList
= null) { removed.teardown(); } } 可以看到,Glide初始化的时候做了很多的事,初始化了缓存相关的类,任务执行以及缓存管理的引擎...`module.class=Uri.class`类型的`ModuleLoader`,从【1.1.2】里面可以看到`register(Uri.class, InputStream.class, new StreamUriLoader.Factory...就是设置一些moduleType。...总结: Glide.with获取到RequestManager对象,然后我们通过RequestManager.load根据modelType获取到GenericRequestBuilder对象。...) modelType可以理解为请求的类型,String Uri File等;resourceType可以理解为请求的结果形式,比如Stream File等;transcodedType可以理解为图片的转换类型
ViewModel 具有生命周期意识,会自动存储和管理 UI 相关的数据,即使设备配置发生变化后数据还会存在,我们就不需要在 onSaveInstanceState 保存数据,在 onCreate 中恢复数据了...Context 可以选择继承 AndroidViewModel,这里继承 ViewModel 就可以了,然后,在 Activity 中使用就可以了,具体如下: MViewModel mViewModel...} return super.create(modelClass); } 具体的 ViewModel 对象创建完成之后,就可以随意调用具体的 ViewModel 中的方法了,前面跟源码的时候会遇到各种封装类...Fragment 之间除了使用同一个 ViewModel 的实例,其他互不相同,任何一个 Fragment 都可单独工作。...每个 Fragment 都有自己的生命周期,可以随意替换和移除都不会互相影响另一个 Fragment 的正常工作。
ViewModelStore 负责 ViewModel 的存储 ViewModelStore 从 ViewModelStoreOwner 中获取。...如果不存在,则会使用 factory 去创建我们的 ViewModel 实例。 创建完成后,会把 ViewModel 实例存在 ViewModelStore 中。...这几层的分工结构可以用下图表示: 构造ViewModel 看到这里,我们比较关心的点剩下的就是如何使用 Factory 创建 ViewModel,以及 Factory 是怎么来的,有哪些 Factory...从这里我们也可以知道,ViewModel 之前在进程被系统终止之后其实是不会保存数据给 ViewModel 的,在添加了 SaveStateHandle 之后才支持。...NonConfigureationInstance 对象,当这个对象存在 ViewModelStore 实例的时候,会直接使用这个 ViewModelStore。
在Android Architecture Components(AAC)中ViewMode是为界面组件提供数据并可在界面配置更改后继续存在的对象。例如界面的旋转导致界面配置信息改变。...ViewModel的实例,通过ViewModelProviders.of()方法传入Activity对象,它会返回一个ViewModelProvider对象,然后我们再使用它的get()来根据不同的ViewModel...ViewModelProvider 到这里我想你心中可能会有如下几个疑问 ViewModel它是如何初始化的,对象是如何实例化的 如何向ViewModel中传递初始化的参数 这两个疑问都将由ViewModelProvider...在这里它通过Class的getConstructor()方法获取匹配的Constructor对象,然后再通过newInstance()方法来获取匹配的对象实例。...下面的能够初步体现使用AAC后的App项目架构形态 ? 最后感谢大家对AAC架构系列的支持!如果感觉不错的话,可以帮忙点赞转发一下,谢谢!同时文章中的代码都可以在Github中获取到。
,这里并没有马上进入数据请求加载过程,而是简单的将数据模式进行了保存,并将isModelSet设置为true,然后返回。...,配置一个请求参数,这里设置的缩放工具,就是加载流程中transformed(缩放)使用到的工具。...Glide过程中,我们可能会调用ImageView的setTag来缓存一些数据,但是在使用Glide加载图片的时候,就会抛出异常,告诉我们使用Glide来加载图片的ImageView不能调用setTag...如果图片没有在显示,但是已经正好还在内存缓存中,没有被销毁,那么直接使用缓存中的资源 4到8: 如果内存中并没有可以直接使用的图片资源,那么就要开始从网络或者本地硬盘中去加载一张图片。...结果仍然是回到SourceGenerator的startNext方法中 而这个时候,就会进入上面提到的另一个情况。
最终在Configuration类中把MappedStatement对象添加进mappedStatements集合中进行管理。...,Mybatis底层在解析Mapper.xml文件最后是转成一个MappedStatement对象进行管理。...并设置MybatisConfiguration作为配置类。 这个MybatisConfiguration是很重要的类,里面会初始化一个mybatisMapperRegistry,后面有用。...最终就是转成MappedStatement对象,然后添加注册,于是乎就有了这些CRUD操作的方法。...非常感谢你的阅读,希望这篇文章能给到你帮助和启发。 觉得有用就点个赞吧,你的点赞是我创作的最大动力~ 我是一个努力让大家记住的程序员。我们下期再见!!!
的实例对象整体 public class MyGirlViewModel extends ViewModel { //定义一个对象,相当于一个用来存放数据的仓库 private static...中存储的Key,Value是我们的ViewModel的.class对象 我们知道了ViewModel是从ViewModelStore中获取的,那既然想做到ViewModel实例的复用,那就是说ViewModelStore...通过看ViewModelProvider的构造方法,我们可以发现是在owner.getViewModelStore()中获取的 public ViewModelProvider(@NonNull...//我们就可以重写onRetainCustomNonConfigurationInstance()这个方法,然后获取的时候可以用getLastNonConfigurationInstance()...,了解即可,现在都推荐使用ViewModel 小总结一下: **我们已经知道了ViewModelStore是在onRetainNonConfigurationInstance()方法中存储的,
上面是利用反射创建了一个带有参数的ViewModel。默认创建的是无参的实例 3.通过get传入对应的Viewmodel的Class对象即可。...1.首次mViewModelStore肯定为null,从nc中取出肯定也取不到只能通过new的方式去创建 2.当经历了屏幕旋转这时候就会从configure中取出viewmodelStore了,对应的也就是第二个红框...key, @NonNull Class modelClass) { //首先从缓存中获取 viewmodelStore可以看成是一个map,保存ViewModel ViewModel...答:1.第一次创建 首先会从对应的Activity中的NoLastConfigure获取activity取出对应的ViewModelStore这个时候由于是第一次所以是null, 于是只能new一个ViewModelStore...在取出configure保存到新创建的activity的属性中。
创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。本篇博客,我们一起深入分析Glide的源码。...ModelLoaderFactory是保存在一个叫resourceToFactories的Map 中,而这个Map又是存储在名叫modelClassToResourceFactories的Map 中 然后是调用...,作为资源的LRU缓存;activeResources是以弱引用为值的Map,用于缓存使用中的资源。...比一般内存缓存额外多一级缓存的意义在于,当内存不足时清理cache中的资源时,不会对使用中的Bitmap造成影响。...方法中调用的抽象方法setResource在子类GlideDrawableImageViewTarget中实现,该方法中调用了ImageView的setImageDrawable方法设置图像。
active的资源是指那些已经被提供给至少一个请求并且还没有被释放的资源。一旦资源的所有使用者都释放了该资源,资源就会去缓存。如果资源从缓存返回到新的使用者,它将重新添加到active资源中。...,dataClass和factory对象关联起来,然后存放到entries的list集合中,这个Entry对象的理解关系到我们后面对整个网络加载的流程。...> entry : entries) {可以看出:从entries集合中分别的遍历出entry对象。...我们看了这么久终于找到了真正的加载器。 当然并不是只有一个,可能有多个,因为在Registry注册了多个可以解析Uri.class的解析器。...我们从第35-42行可以看出,这里是在遍历每一个loader,并且去加载数据。 那么我们看下如何加载数据的?
只输入用户名认证需要在你的 user identity class 类中实现 findIdentityByAccessToken() 方法 (2)如果需要验证用户名和密码,HttpBasicAuth 中的注释中也说明了配置方法...从认证服务器上获取基于OAuth2协议的access token,然后通过 HTTP Bearer Tokens 发送到API 服务器。...同样也是客户端 header中传入 Authorization:Bearer xxxxxx,然后在你的 user identity class 类中实现 findIdentityByAccessToken...() 方法 3、JSONP请求: \yii\filters\auth\QueryParamAuth 在 URL请求参数中加入 access_token,这种方式应主要用于JSONP请求,因为它不能使用...($params['sign']); ksort($params); //$privateKey 为客户端和服务端协商好的一个秘钥 $sign = md5($privateKey . implode('
设备信息发生变更数据不会丢失(切横竖屏),其实它只有一个生命周期,检测页面销毁时触发 ViewModel 的另一个特点就是同一个 Activity 的 Fragment 之间可以使用ViewModel实现共享数据...,因为数据是从livedata中监听的,只有livedata触发了更新,Activity才会收到通知。...这个方式比较老了,在源码中也能发现,ViewModelProviders的of方法其实也是调用了ViewModelProvider,自动创建了一个factory。...create是创建一个新的实例,而get是先从HashMap中找,找不到就创建新的实例。...也是为什么重建的Viewmodel是同一个对象的原因,他会把对象放在ViewModelStore类中HashMap mMap = new HashMap();中
截止到目前为止,JetpackNote源码分析的文章已经有四篇文章了,这一系列的文章我的初衷是想仔细研究一下Jetpack,最终使用Jetpack组件写一个Demo,上一篇已经分析了LiveData,...在之前的DemoViewModel中我们存储了seekbar的值,然后我们看Fragment中是怎么实现的?...,而且当你使用一个组件的时候,一步一步的跟着代码走,慢慢的分析了整个的组件设计方式,最后站在开发这个组件的角度,去看他的设计思想和一些模式的时候,对自己本身也是一个很大的提高,所以我真的建议有兴趣的可以跟着自己的思路一步一步的看下源码...但是在我这里发现跟他们的都不一样,我搜了一下ViewModelStores,发现它已经‘退役’了。 ? 并且它的注释也告诉了我们它的继承者: ? 也就是我们在of()方法中的: ?...,一共5篇源码分析,文章中的Demo我写了一个APP—JetpackNote,里面有基本的Demo例子,和文章的分析;一直也没有提到是因为功能还不完善,我会尽快完善它的,也希望有什么意见的小伙伴可以和我沟通交流
领取专属 10元无门槛券
手把手带您无忧上云