利用保存闭包回到登录前的事件

假设一个场景,用户看到一条有趣的新闻想要点赞时,发现没有登录就跳转到登录页面,当用户登录完成或者注册完成返回时,大多数App处理方式都是让用户再次操作点赞行为,才算完成这个流程,比较好的优化方式,是当用户登录完成返回以后,自动进行点赞,这个过程能连接上,先来看一张图:

模拟登录

登录页面LoginVC
注册页面RegisterVC
点赞详情页面TargetVC

1.登录相关的操作

extension Bool {
    //是否登录
    static var isLoginKey:Bool {
        let user = UserDefaults.standard.bool(forKey: "OnlineStatus") == true
        return user
    }
}
//用户登出
func logout(){
    UserDefaults.standard.set(false, forKey: "OnlineStatus")
    UserDefaults.standard.synchronize()
}
//用户登录
func login(){
    UserDefaults.standard.set(true, forKey: "OnlineStatus")
    UserDefaults.standard.synchronize()
}

2.主要代码

final class UserInfo{
    static let singleton = UserInfo()
    private init(){}
    var task:Task?
    func cancel() -> Void{
        if let unwrappedTask = task {
            unwrappedTask(true)
        }
    }
}

typealias Task = (_ cancel:Bool) -> Void

protocol LoginHandler {
    func checklogin(closure:@escaping ()->Void) -> Task
    func save(task:@escaping Task)
}

extension LoginHandler where Self:UIViewController {
    func checklogin(closure:@escaping ()->Void) -> Task {
        
        var result:Task?
        
        let autoClosure:Task = { cancel in
            if cancel == true {
                closure()
            }else{
                let login = LoginVC()
                let nav = UINavigationController(rootViewController: login)
                self.present(nav, animated: true, completion:nil)
            }
        }
        
        result = autoClosure
        
        return result!
    }
    
    func save(task:@escaping Task){
        
        if Bool.isLoginKey == false {
            task(false)
            UserInfo.singleton.task = task
        }else{
            task(true)
        }
        
    }
}

3.在首页ViewController中需遵守LoginHandler协议:

class ViewController: UIViewController,LoginHandler {}
//按钮点击
func btnAction(){
     let task = checklogin {
     self.navigationController?.pushViewController(TargetVC(), animated: true)
        }
     save(task: task)
}

4.在完成登录/注册,利用模态方式返回时

dismiss(animated: true, completion: {
      UserInfo.singleton.cancel()
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,079评论 25 709
  • 学习内容地址:http://blog.csdn.net/self_study/article/details/52...
    鲜果时光阅读 3,754评论 0 0
  • 1. 于茯苓是我的一个校友,俄语专业,为人直爽,算是巾帼中的须眉。 说起我和茯苓的相识,还是挺不可思议的。三百多人...
    花心小五阅读 4,077评论 3 7
  • 82788bc7faad阅读 1,787评论 0 3
  • 我和谁都不争,和谁争我都不屑。我爱大自然,其次是艺术。我双手烤着,生命之火取暖。火萎了,我也准备走了。——杨绛。 ...
    迎火虫哟阅读 1,820评论 0 0