登录注册(MVVM+ReactiveCocoa)

登录注册(MVVM+ReactiveCocoa)_第1张图片

登录注册逻辑梳理

  • 登录主要就是考虑几个UI控件的联动反应,至于如何船体联动信息,不就是靠RAC来处理么,首先说一下所有的UI空间包括,用户名输入框、密码输入框、登录按钮。

  • 登录界面最核心的元素就三个,如何处理三个UI元素的联动就是RAC信号需要考虑的。

  • 联动反应总共包括:

    • 用户名输入框的输入内容每输入一个字符就判断一次,判断的标准包括字符最低数量和字符最高数量、首位字符是否是1。如果首位字符不是1,那么立马提示用户,请输入电话号码,或者说根本第一个数字就只能输入1,其它的数字都输入不了,接下来,在输入第2位数字到第10位数字的时候发送的信后都过滤掉,不发送,一旦输入第11位字符,立马假设用户输入的就是电话号码,开始进入RACmap遍历,验证输入的这11个字符是否是一个合法的电话号码。

    • 如果合法返回YES信号,如果不合法返回NO信号,那么都有谁订阅这个用户名输入框的信号呢,自然首先就是输入框的背景颜色属性与这个用户名输入框的信号做了绑定,一旦返回YES信号,立马通过三目运算符改变用户名输入框的颜色,表示用户名输入的电话号码是合法有效的,同时将密码输入框作为键盘的第一响应者,这样就不用用户手动撤销键盘,然后在点击密码输入框重新开启这个键盘了,大大优化用户体验。如果在控制器直接就map遍历用户名输入框的信号,这样确实很简单,但是,这就没有体现出使用MVVM最大化程度上优化控制器的目的。

    • 限定用户名输入框最高输入11位数,含很简单,一旦超过11位数,立马就不允许输入,获取说输入后置是显示前11位数,后面的自动删除。

StoryBoard

  • 为了不破坏StoryBoard的完整性,决定按钮点击后立马跳转控制器,但是验证码输入是否正确将没法判断,最好的解决方案就是想搜索那样,只要输入了6个数字,就进行验证码的校正请求。

  • storyBoard跳转之前执行判断,判断是否验证码合乎身份,如果合法,继续跳转,如果不合法,就停止跳转,问题是不论验证码合不合法,怎么都条控制器呀,这就不科学了,尽管即将跳转时,可以给控制器传递点数据,但是,依然不能解决跳转中止。

  • 当我用代码校验验证码成功跳转LoginStoryBoard的控制器,出现的问题是,居然控制器上什么也没有,这是什么鬼?难道我创建了一个新的控制器么,这可咋整,一定是的,不然怎么会什么也没有?对比了,以为是没有在使用StoryBoardID前打上勾,但是发现,打上勾依然没用。

  • 原本以为是没有创造了新的控制器,但是我看控制器的背景View,又真的是一点疑问也没有,只是输入框这些玩意儿不知道去哪里了,简直了,问题出在哪里呢?什么线索。原来是ID重复了,换了一个独一无二的ID就什么问题没有了。

请求头的意义?

  • 传入UserId是因为服务器想要知道这个请求是谁发的

  • 传入Token是想判断当前UserID用户是否有资格来发送这个请求

  • 传入设备的唯一ID是为了通知推送

  • 密码必须MD5加密,否则反馈参数错误

猿题库网络请求设置BaseUrl无效?

  • 无论BaseUrl最后有没有/字符,三方库都会构造一个/字符,所以detailUrl的前面一定不能有/字符.

  • 三方库没有对DetailUrl的首字符/判断,只要出现两个//字符,直接就忽略了后面的detailUrl

登录

  • 判断登录状态。在BaseViewModel里面声明并实现judgeWhetherLogin判断用户是否已经登录的方法,本质通过[UserManager currentUser]全局用户管理类的isLogin属性来判断。往往真相就是这么简单,用户是否登录这个信息竟然是以BOOL属性值的形式存储在[UserManager currentUser],因为[UserManager currentUser]全局单例类模型对象存储于沙盒之中,这样即使APP退出后依然记录该用户的登录状态。

  • 跳转登陆控制器。BaseViewModel里实例化LoginViewModel继而跳转到LoginViewController之中,把judgeWhetherLogin方法写在BaseViewModel里面带来的好处可见一斑。

  • 判断用户是否登录和跳转到登录控制器是绑定到一起的,问题在于跳转控制器是需要导航控制器和目标控制器的,如果说目标控制器可以通过类名字符串转类Class来实现,那么持有导航控制器的类则成了绑定登录控制器跳转的最好选择,在MVVM结构之中,控制器ViewControllerViewModel都可以实现控制器的跳转,但是ViewModel持有的BaseNav是经过加工的导航控制器,因此可以给控制器的跳转封装一些自定义的内容,比如说可以把目标普通控制器的构造代码统一封装到我们加工过的BaseNav里面,如此一来,就可以通过传入目标控制器的类的字符串名称来构建目标控制器了。

  • 还有,既然决定了通过BaseViewModel操作BsaeNav属性来跳转控制器,那么把登录控制器的跳转写到BaseViewModel里面,如此轻松实现BaseViewModel的所有子类直接调用父类的方法跳转登录控制器。

  • 既然跳转登录控制器通常和判断登录状态始终绑定到了一起,干脆把这两个方法封装成一个方法judgeWhetherLogin声明并是实现在BaseViewModel里。如此一来,BaseViewModel的所有子类都可以调用父类判断用户是否登录的方法,同时跳转到登录控制器的也不用写了。

你可能感兴趣的:(登录注册(MVVM+ReactiveCocoa))