最近项目中碰到这样一个场景:用户A进入某个好友B个人主页,从B粉丝列表中进入其中另一个好友C个人页面,从C又可以再次进入B个人主页,就这样循环进入同一个人的个人主页(虽然觉得不合理,现实就是如此(´・_・`)),这时出现了一种情况,在B个人主页做某些操作,影响了B的一些属性,当前页面已经产生效果,但是在其他的B个人页面属性却保持旧值,通常用通知来让前面的页面获取属性新值,可是感觉好麻烦╮("" ̄▽ ̄"")╭,那有什么办法,让一个ID的用户对象在工程中永远只存在一份呢?
应需要想到一个比较拙的办法大致方向如下:
1、私有化init/new等原初始化方法跟指定新的初始方法(比较条件为输入参数)
- (instancetype)init __attribute__((unavailable("Disabled. Use -initWithID: instead")));
+ (instancetype)new __attribute__((unavailable("use object initializers instead")));
- (instancetype)initWithID:(NSString *)userID NS_DESIGNATED_INITIALIZER;
2、在LYFriendInfoModel.m中定义一个静态的NSMapTable记录同样条件下已存在的对象
static NSMapTable *friendsMapTable;
modelsMapTable = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0];
其中NSMapTable的设置:ID为key,对value的持有方式是weak,即只是引用,这样才能确保一个对象无外部显示持有时即被释放
3、在初始化方法中先通过friendsMapTable查找是否有符合条件的对象,有的话直接返回
- (instancetype)initWithID:(NSString *)userID {
if (userID == nil) {
return nil;
}
LYFriendInfoModel *model = [friendsMapTable objectForKey:userID];
if (model) {
return model;
}
if (self = [super init]) {
self.userID = userID;
[friendsMapTable setObject:self forKey:userID];
}
return self;
}
现在项目使用过程中,一般直接使用Json转换模型库(json字串-> NSDictionary->Model),也需要改动下:
1、优先选择使用指定的初始化方法进行初始化
2、1存在的话,提供对应的初始化方法的输入参数字段名称数组
3、设置优先赋值的属性字段名称数组 -- 非必需,只是这次也干脆处理了
这样就基本在项目中够用了(后面同样的方式用在了从相册中重复获取同一张图片的操作,避免了各种手动查找)。。。如果有更好的方式方法麻烦告诉下我哦~~~感觉还是稍许麻烦
网友评论