美文网首页程序猿阵线联盟-汇总各类技术干货IOS
登录状态的判定与处理(优化版)

登录状态的判定与处理(优化版)

作者: 春暖花已开 | 来源:发表于2018-11-14 15:30 被阅读13次

背景:前几天,写了一个登录状态的判定与处理,感觉写得不是很简洁,而且处理不好很容易出现多次持有,造成登录控制器不能释放的问题。于是在上班的间隙重新写了一个,作为“优化版”。

工具

#import <UIKit/UIKit.h>

@interface UIViewController (LoginStatus)

/**
 适用于:
 跳转前需要检查登录状态,并且处于登录状态或登录成功后由`自己`处理的情况
 
 说明:目前逻辑是当用户处于未登录状态,但点击了需要登录才能跳转的页面时,会先跳转到登录页面;
 如果登录不成功会停留在登录页面,用户可以点击“关闭”来返回当前页面,故只存在登录成功回调
 */
- (void)beforePushCheckLoginStatusWithSuccess:(void (^)(void))successBlock;

@end
#import "UIViewController+LoginStatus.h"

#import "MZAccountManager.h"
#import <objc/runtime.h>

/** 登录状态的判定依据 */
static NSString *const kToken = @"token";
/** 登录控制器的类名 */
static NSString *const kLoginVCClassName = @"LoginViewController";


@interface UIViewController ()

@property (nonatomic, copy) dispatch_block_t successBlock;

@end

@implementation UIViewController (LoginStatus)

- (void)beforePushCheckLoginStatusWithSuccess:(void (^)(void))successBlock {
    
    self.successBlock = successBlock;
    
    // 如果没有登录
    if ([self isEmpty:MZUserManager.token] || [MZUserManager.token isEqualToString:@"##"]) {
        UIViewController *loginVC = [[NSClassFromString(kLoginVCClassName) alloc] init];
        if (loginVC) {
            [MZUserManager addObserver:self forKeyPath:kToken options:NSKeyValueObservingOptionNew context:nil];
            UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:loginVC];
            [self presentViewController:navVC animated:YES completion:nil];
        }
    } else {
        !self.successBlock ?: self.successBlock();
    }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    
    if ([keyPath isEqualToString:kToken]) {
        // 登录成功
        if (![self isEmpty:change[NSKeyValueChangeNewKey]] && ![change[NSKeyValueChangeNewKey] isEqualToString:@"##"]) {
            !self.successBlock ?: self.successBlock();
        }
        [MZUserManager removeObserver:self forKeyPath:kToken];
    }
}


#pragma mark - Private Methods

- (BOOL)isEmpty:(NSString *)scrString {
    return (scrString == nil || scrString.length == 0 || [scrString isKindOfClass:[NSNull class]]);
}

- (dispatch_block_t)successBlock {
    return objc_getAssociatedObject(self, _cmd);
}

- (void)setSuccessBlock:(dispatch_block_t)successBlock {
    objc_setAssociatedObject(self, @selector(successBlock), successBlock, OBJC_ASSOCIATION_COPY);
}


@end

登录控制器的处理

#import "LoginViewController.h"

#import "MZAccountManager.h"

@interface LoginViewController ()



@end

@implementation LoginViewController

#pragma mark - Life Cycle

- (void)viewDidLoad {
    [super viewDidLoad];
    
     NSLog(@"%@创建了&&token=%@", [self.class description], MZUserManager.token);
}


#pragma mark - Private Methods

// 点击登录按钮
- (IBAction)loginAction:(id)sender {
    
    MZUserManager.token = @"点击登录,并且登录成功了";
    [self dismissLoginVC];
}

// 点击关闭按钮
- (IBAction)closeAction:(id)sender {
    
    MZUserManager.token = @"##";
    [self dismissLoginVC];
}

- (void)dismissLoginVC {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)dealloc {
    NSLog(@"%@释放了", self.class);
}


@end

相关文章

  • 登录状态的判定与处理(优化版)

    背景:前几天,写了一个登录状态的判定与处理,感觉写得不是很简洁,而且处理不好很容易出现多次持有,造成登录控制器不能...

  • 登录状态的判定与处理

    很多时候,跳转到下一个控制器或者响应某个事件之前,需要判断登录状态。如果没有登录,就调起登录控制器,完成登录之后,...

  • 9.“简阅”——写文章功能(2)

    前端 注意:在首页点击“写文章”按钮,要判定登录状态,如果没登录,跳转到登录页面;如果已经登录,跳转到写文章页面 ...

  • 微信jssdk登录实例

    状态码 采用标准的HTTP状态码 步骤 代码 在每个请求中判定是否符合登录条件。 应用示例 因为此app有多个角色...

  • iOS实现登录状态处理

    今天要说的是如何记录我们用户的登陆状态。例如微信,QQ等,在用户登陆后,关闭应用在打开就直接登陆了。那么我们在项目...

  • Unity与Android交互方案

    Unity与Android交互方案优化版Unity与Android交互方案优化版续:使用自定义Activity【U...

  • 微信小程序登陆流程(20200322)

    客户端 开发版和测试版首次登录需要用户手动触发登录。比如点击指定登录组件 对应的事件处理 服务端 根据客户端传过来...

  • 添加请求拦截器

    页面进行post请求时,需要用过请求拦截器处理优化。(登录,注册等)

  • 算法设计与分析笔记之自身规约

    判定问题和优化问题 判定问题:是否存在一个...(如小于k的点覆盖) 优化问题:找出最大/最小的...(最小点覆盖...

  • 如何规划好网站的URL-国平

    阅读文档: 《优化网站的抓取与收录》中文版 《谷歌搜索引擎入门指南》第7页到11页 《创建方便 Google 处理...

网友评论

    本文标题:登录状态的判定与处理(优化版)

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