美文网首页
利用保存闭包回到登录前的事件

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

作者: 五月飞 | 来源:发表于2017-01-15 19:08 被阅读21次

    假设一个场景,用户看到一条有趣的新闻想要点赞时,发现没有登录就跳转到登录页面,当用户登录完成或者注册完成返回时,大多数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()
    })
    

    相关文章

      网友评论

          本文标题:利用保存闭包回到登录前的事件

          本文链接:https://www.haomeiwen.com/subject/itfubttx.html