单例存储账号

返回doc路径

#import "NSString+DocumentPath.h"

@implementation NSString (DocumentPath)

+(NSString *)fileDocumentsPathWith:(NSString *)name{
    NSString *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

    NSString *filePath = [documents stringByAppendingPathComponent:name];
    return filePath;
}
#import "AccountInfo.h"
#import "NSString+DocumentPath.h"

#define kAccountFileName @"accountInfo"

@implementation AccountInfo

+(instancetype)currentAccount{
    static AccountInfo *account;

    //代码只执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        NSString *filePath = [NSString fileDocumentsPathWith:kAccountFileName];
        account  = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
        if (!account) {
            account = [[AccountInfo alloc] init];
        }
    })
    return account;
}
//存储信息,
-(void)saveLoginInfo:(NSDictionary *)info{
    //1.保存 token
    self.accessToken = info[@"access_token"];
    self.uid = info[@"uid"];

    //当前时间
    NSDate *date = [NSDate date];
    //生命周期
    NSNumber *expires = info[@"expires_in"];
    //有效的截止时间
    self.expiresIn = [date dateByAddingTimeInterval:expires.floatValue];

    //归档登录信息
    [NSKeyedArchiver archiveRootObject:self toFile:[NSString fileDocumentsPathWith:kAccountFileName]];
}

-(BOOL)isLogin{
    //比较有效截止时间跟当前时间
    NSComparisonResult result  = [self.expiresIn compare:[NSDate date]];
    if (self.accessToken && result > 0) {
        return YES;
    }
    return NO;
}

-(BOOL)logout{
    self.accessToken = nil;
    self.uid = nil;
    self.expiresIn = nil;

    //删除归档文件
    NSFileManager *manager = [NSFileManager defaultManager];

    //文件路径
    NSString *filePath = [NSString fileDocumentsPathWith:kAccountFileName];
    //删除归档的登录信息
    [manager removeItemAtPath:filePath error:nil];

    return YES;
}
//返回固定的网络参数
-(NSMutableDictionary *)requetsParams{
    if ([self isLogin]) {
        return [NSMutableDictionary dictionaryWithObject:self.accessToken forKey:@"access_token"];
    }
    return nil;
}

#pragma mark coding 代理

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super init];
    if (self) {
        self.accessToken = [aDecoder decodeObjectForKey:@"access_token"];
        self.expiresIn = [aDecoder decodeObjectForKey:@"expires_in"];
        self.uid = [aDecoder decodeObjectForKey:@"uid"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)coder
{
    //保存对象的属性
    [coder encodeObject:self.accessToken forKey:@"access_token"];
    [coder encodeObject:self.expiresIn forKey:@"expires_in"];
    [coder encodeObject:self.uid forKey:@"uid"];

}
时间: 2025-01-08 20:09:41

单例存储账号的相关文章

php : MVC 演示(使用单例工厂)

此例子是MVC的简单应用, 要达到的效果如下: 用户列表: 姓名 年龄 学历 兴趣 出生地 账号创建时间 操作 keen 20 高中 篮球,足球 广东 2016-11-08 10:00:31 删除 andi 30 本科 乒乓球 上海 2016-11-22 10:00:55 删除 ddddddd 40 初中 台球 广州 2016-11-10 12:20:49 删除 eeeeeee 34 大专 慢跑 深圳 2016-11-15 12:21:26 删除 当前用户总数: 4 一.设计表 create t

Spring Controller单例与线程安全那些事儿

目录 单例(singleton)作用域 原型(Prototype)作用域 多个HTTP请求在Spring控制器内部串行还是并行执行方法? 实现单例模式并模拟大量并发请求,验证线程安全 附录:Spring Bean作用域 单例(singleton)作用域 每个添加@RestController或@Controller的控制器,默认是单例(singleton),这也是Spring Bean的默认作用域. 下面代码示例参考了Building a RESTful Web Service,该教程搭建基于S

滥用单例

原文: http://objccn.io/issue-13-2/ 单例是整个 Cocoa 中被广泛使用的核心设计模式之一.事实上,苹果开发者库把单例作为 "Cocoa 核心竞争力" 之一.作为一个iOS开发者,我们经常和单例打交道,比如 UIApplication 和 NSFileManager 等等.我们在开源项目.苹果示例代码和 StackOverflow 中见过了无数使用单例的例子.Xcode 甚至有一个默认的 "Dispatch Once" 代码片段,可以使

避免滥用单例

单例是整个 Cocoa 中被广泛使用的核心设计模式之一.事实上,苹果开发者库把单例作为 "Cocoa 核心竞争力" 之一.作为一个iOS开发者,我们经常和单例打交道,比如 UIApplication 和 NSFileManager 等等.我们在开源项目.苹果示例代码和 StackOverflow 中见过了无数使用单例的例子.Xcode 甚至有一个默认的 "Dispatch Once" 代码片段,可以使我们非常简单地在代码中添加一个单例: + (instancetyp

android里单例对象和某些数据被释放的问题

接触正式的android开发已经有一段时间了,项目的第一个版本终于快完成了.有一次自己在测试的时候,把自己的android项目切到后台,同时打开了几个应用之后重新切回到自己的app,发现报错了.经过排查,发现是自己的单例对象中的数据被释放掉了,也就是int变量的值 变成了0,string变量的值变成了null. 我的单例一开始是这样的(举例); public class UserInfo { private static UserInfo userInfo = null; private int

设计模式的征途—1.单例(Singleton)模式

单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展.每一个创建型模式都在视图回答3个问题:3W -> 创建什么(What).由谁创建(Who)和何时创建(When). 本篇是创建型模式的第一篇,也是最简单的一个设计模式,虽然简单,但是其使用频率确是很高的. 单例模式(Singleton) 学习难度:★☆☆☆☆ 使用频率:★★★★☆ 一.单例

页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,

首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @property (nonatomic, strong) NSString *myName;//单例的属性,用于传值 +(DataSource*)sharedDataSource;//建立单例对象 @end .m文件 #import "DataSource.h" @implementati

UI_12 ModalViewController(模态),单例设计模式

?.模态viewController 1.介绍 程序中切换??,可以使?UINavigationController.通过导航功能实现??切换.使用    pushViewController:animated:该方法显示的视图具有层级关系;而使用模态视图控制器presentViewController:animated:completion显示的视图与之前的视图控制器平级(或者说是两个不相干的层级). 使用场景 临时展??些内容.例如:程序中?户登录,通讯录中添加联系?等等. UIImageP

第79讲:单例深入讲解及单例背后的链式表达式

今天我们来看一下scala中的单例及单例的链式表达式 让我们通过代码进行分析. object Scalaclass Java1class JVM{def method1:this.type=this}class JVM_Language extends JVM{def method2:this.type=this}object Singleton_type{def main(args:Array[String]){println(Scala.getClass)println(typeOf[Sca