27
27
#import " SABLogBridge.h"
28
28
#import " SABValidUtils.h"
29
29
#import " SABFileStore.h"
30
+ #import " SABBridge.h"
30
31
31
32
@interface SABExperimentDataManager ()
32
33
33
34
// / 试验结果
34
- @property (atomic , copy ) NSDictionary <NSString *, SABExperimentResult *> *experimentResults ;
35
+ @property (atomic , strong ) SABFetchResultResponse *resultResponse ;
35
36
@property (nonatomic , strong ) dispatch_queue_t serialQueue;
36
37
@end
37
38
@@ -48,9 +49,10 @@ - (instancetype)init {
48
49
return self;
49
50
}
50
51
51
- - (void )asyncFetchAllExperimentWithRequest : (NSURLRequest *)request completionHandler : (SABFetchResultResponseCompletionHandler)completionHandler {
52
-
53
- [SABNetwork dataTaskWithRequest: request completionHandler: ^(id _Nullable jsonObject, NSError *_Nullable error) {
52
+ - (void )asyncFetchAllExperimentWithRequest : (SABExperimentRequest *)requestData completionHandler : (SABFetchResultResponseCompletionHandler)completionHandler {
53
+
54
+ NSString *requestDistinctId = [SABBridge distinctId ];
55
+ [SABNetwork dataTaskWithRequest: requestData.request completionHandler: ^(id _Nullable jsonObject, NSError *_Nullable error) {
54
56
if (error) {
55
57
SABLogError (@" asyncFetchAllABTest failure, error: %@ , jsonObject: %@ " , error, jsonObject);
56
58
completionHandler (nil , error);
@@ -64,17 +66,35 @@ - (void)asyncFetchAllExperimentWithRequest:(NSURLRequest *)request completionHan
64
66
return ;
65
67
}
66
68
69
+ // 判断 distinctId 是否变化
70
+ NSString *currentDistinctId = [SABBridge distinctId ];
71
+ if (![currentDistinctId isEqualToString: requestDistinctId]) {
72
+ SABLogWarn (@" distinctId has been changed, requestDistinctId is %@ , currentDistinctId is %@ , Retry to asyncFetchAllABTest" , requestDistinctId, currentDistinctId);
73
+
74
+ // 刷新用户标识
75
+ [requestData refreshUserIdenty ];
76
+
77
+ // 重试请求
78
+ [self asyncFetchAllExperimentWithRequest: requestData completionHandler: ^(SABFetchResultResponse * _Nullable responseData, NSError * _Nullable error) {
79
+ completionHandler (responseData, error);
80
+ }];
81
+ return ;
82
+ }
83
+
67
84
// 数据解析
68
85
SABFetchResultResponse *responseData = [[SABFetchResultResponse alloc ] initWithDictionary: jsonObject];
69
86
70
87
// 获取试验成功,更新缓存
71
88
if (responseData.status == SABFetchResultResponseStatusSuccess) {
72
89
SABLogInfo (@" asyncFetchAllExperiment success jsonObject %@ " , jsonObject);
73
- self.experimentResults = responseData.results ;
90
+
91
+ // 缓存请求时刻的 distinctId
92
+ responseData.distinctId = requestDistinctId;
93
+ self.resultResponse = responseData;
74
94
// 存储到本地
75
- [self archiveExperimentResult: responseData.results ];
95
+ [self archiveExperimentResult: responseData];
76
96
} else {
77
- SABLogWarn (@" asyncFetchAllExperiment fail,request: %@ ,jsonObject %@ " , request, jsonObject);
97
+ SABLogWarn (@" asyncFetchAllExperiment fail,request: %@ ,jsonObject %@ " , requestData. request , jsonObject);
78
98
}
79
99
completionHandler (responseData, nil );
80
100
}];
@@ -84,18 +104,37 @@ - (void)asyncFetchAllExperimentWithRequest:(NSURLRequest *)request completionHan
84
104
- (void )unarchiveExperimentResult {
85
105
dispatch_async (self.serialQueue , ^{
86
106
NSData *data = [SABFileStore unarchiveWithFileName: kSABExperimentResultFileName ];
87
- NSDictionary <NSString *, SABExperimentResult *> *result = [NSKeyedUnarchiver unarchiveObjectWithData: data];
88
- if ([result isKindOfClass: NSDictionary .class] && result.count > 0 ) {
89
- self.experimentResults = [result copy ];
107
+ id result = [NSKeyedUnarchiver unarchiveObjectWithData: data];
108
+
109
+ // 解析缓存
110
+ if ([result isKindOfClass: SABFetchResultResponse.class]) {
111
+ SABFetchResultResponse *resultResponse = (SABFetchResultResponse *)result;
112
+ NSString *distinctId = [SABBridge distinctId ];
113
+ // 校验缓存试验的 distinctId
114
+ if ([resultResponse.distinctId isEqualToString: distinctId] && resultResponse.results .count > 0 ) {
115
+ self.resultResponse = resultResponse;
116
+
117
+ SABLogInfo (@" unarchiveExperimentResult success jsonObject %@ " , resultResponse.responseObject );
118
+ }
119
+
120
+ // TODO: v0.0.3 添加,尝试删除一次老版缓存,下个版本移除
121
+ } else {
122
+ // 首次安装,删除老版缓存
123
+ BOOL isDelete = [SABFileStore deleteFileWithFileName: kSABExperimentResultOldFileName ];
124
+ if (isDelete) {
125
+ SABLogInfo (@" delete old version experimentResult success" );
126
+ } else {
127
+ SABLogWarn (@" delete old version experimentResult fail" );
128
+ }
90
129
}
91
130
});
92
131
}
93
132
94
133
// / 写入本地缓存
95
- - (void )archiveExperimentResult : (NSDictionary <NSString *, SABExperimentResult *> *) result {
134
+ - (void )archiveExperimentResult : (SABFetchResultResponse *) resultResponse {
96
135
// 存储到本地
97
136
dispatch_async (self.serialQueue , ^{
98
- NSData *data = [NSKeyedArchiver archivedDataWithRootObject: result ];
137
+ NSData *data = [NSKeyedArchiver archivedDataWithRootObject: resultResponse ];
99
138
[SABFileStore archiveWithFileName: kSABExperimentResultFileName value: data];
100
139
});
101
140
}
@@ -107,7 +146,12 @@ - (SABExperimentResult *)cachedExperimentResultWithParamName:(NSString *)paramNa
107
146
if (![SABValidUtils isValidString: paramName]) {
108
147
return nil ;
109
148
}
110
- return self.experimentResults [paramName];
149
+ return self.resultResponse .results [paramName];
150
+ }
151
+
152
+ - (void )validateExperiment {
153
+ // TODO: v0.0.3 添加,因为 SA 的问题,这里或 distinctId 可能不是最新,直接清除缓存即可,待 SA 通知逻辑更新后,改成判断 distinctId 是否一致来清除缓存
154
+ self.resultResponse = nil ;
111
155
}
112
156
113
157
@end
0 commit comments