Commit 1e21ef15 authored by 井庆林's avatar 井庆林

code review

parents 55735550 44220834
...@@ -39,6 +39,8 @@ static NSString *sdkVersion = @"1.3.1"; ...@@ -39,6 +39,8 @@ static NSString *sdkVersion = @"1.3.1";
static dispatch_semaphore_t _immediatelySemaphore; static dispatch_semaphore_t _immediatelySemaphore;
static dispatch_semaphore_t _normalSemaphore; static dispatch_semaphore_t _normalSemaphore;
static dispatch_queue_t _immediatelyQueue;
static dispatch_queue_t _normalQueue;
+ (Phobos *)clientWithAppName:(NSString *)appName channelId:(NSString *)channelId{ + (Phobos *)clientWithAppName:(NSString *)appName channelId:(NSString *)channelId{
Phobos.sharedClient.appName = appName; Phobos.sharedClient.appName = appName;
...@@ -51,6 +53,8 @@ static dispatch_semaphore_t _normalSemaphore; ...@@ -51,6 +53,8 @@ static dispatch_semaphore_t _normalSemaphore;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
_immediatelySemaphore = dispatch_semaphore_create(1); _immediatelySemaphore = dispatch_semaphore_create(1);
_normalSemaphore = dispatch_semaphore_create(1); _normalSemaphore = dispatch_semaphore_create(1);
_immediatelyQueue = dispatch_queue_create("immdiately", DISPATCH_QUEUE_CONCURRENT);
_normalQueue = dispatch_queue_create("normal", DISPATCH_QUEUE_CONCURRENT);
}); });
} }
...@@ -438,7 +442,7 @@ static dispatch_semaphore_t _normalSemaphore; ...@@ -438,7 +442,7 @@ static dispatch_semaphore_t _normalSemaphore;
} }
+ (void)track:(NSString *)eventName{ + (void)track:(NSString *)eventName{
[self track:eventName attributes:@{} sendNow:NO currentAPI:_sharedClient.serverAPI]; [self track:eventName attributes:nil sendNow:NO currentAPI:_sharedClient.serverAPI];
} }
+ (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes{ + (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes{
...@@ -450,7 +454,7 @@ static dispatch_semaphore_t _normalSemaphore; ...@@ -450,7 +454,7 @@ static dispatch_semaphore_t _normalSemaphore;
} }
+ (void)track:(NSString *)eventName currentAPI:(NSString *)currentAPI { + (void)track:(NSString *)eventName currentAPI:(NSString *)currentAPI {
[self track:eventName attributes:@{} sendNow:NO currentAPI:currentAPI]; [self track:eventName attributes:nil sendNow:NO currentAPI:currentAPI];
} }
+ (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes currentAPI:(NSString *)currentAPI { + (void)track:(NSString *)eventName attributes:(NSDictionary *)attributes currentAPI:(NSString *)currentAPI {
...@@ -489,22 +493,24 @@ static dispatch_semaphore_t _normalSemaphore; ...@@ -489,22 +493,24 @@ static dispatch_semaphore_t _normalSemaphore;
} }
- (void)trackPhobosWithURL:(NSString *)url data:(NSDictionary *)data immediate:(BOOL)immediate { - (void)trackPhobosWithURL:(NSString *)url data:(NSDictionary *)data immediate:(BOOL)immediate {
dispatch_semaphore_wait(_normalSemaphore, DISPATCH_TIME_FOREVER); dispatch_async(_normalQueue, ^{
NSMutableDictionary *dataDict = [[GMCache fetchObjectAtDocumentPathWithkey:PhobosNormalCacheKey] mutableCopy]; dispatch_semaphore_wait(_normalSemaphore, DISPATCH_TIME_FOREVER);
_normalCount++; NSMutableDictionary *dataDict = [[GMCache fetchObjectAtDocumentPathWithkey:PhobosNormalCacheKey] mutableCopy];
if (!immediate) { _normalCount++;
dataDict = [self dataDict:dataDict setObject:data forKey:url]; if (!immediate) {
[GMCache storeObjectAtDocumentPathWithkey:PhobosNormalCacheKey object:dataDict]; dataDict = [self dataDict:dataDict setObject:data forKey:url];
} [GMCache storeObjectAtDocumentPathWithkey:PhobosNormalCacheKey object:dataDict];
if (immediate || self.normalCount >= 50) { // 数据超过一定数量 或 进入后台等逻辑,统一进行发送普通埋点数据 }
[dataDict enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSArray * _Nonnull obj, BOOL * _Nonnull stop) { if (immediate || self.normalCount >= 50) { // 数据超过一定数量 或 进入后台等逻辑,统一进行发送普通埋点数据
if (obj && obj.count > 0) { [dataDict enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSArray * _Nonnull obj, BOOL * _Nonnull stop) {
[self sendImmediatelyPhobosWithURL:key data:obj]; if (obj && obj.count > 0) {
} [self sendImmediatelyPhobosWithURL:key data:obj];
}]; }
[Phobos removeAllNormalPhobosData]; }];
} [Phobos removeAllNormalPhobosData];
dispatch_semaphore_signal(_normalSemaphore); }
dispatch_semaphore_signal(_normalSemaphore);
});
} }
/** /**
...@@ -513,29 +519,31 @@ static dispatch_semaphore_t _normalSemaphore; ...@@ -513,29 +519,31 @@ static dispatch_semaphore_t _normalSemaphore;
* @param data : 使用id类型是因为直接调用实时埋点传过来的是Dict,而普通埋点过来的则是Array类型 * @param data : 使用id类型是因为直接调用实时埋点传过来的是Dict,而普通埋点过来的则是Array类型
*/ */
- (void)sendImmediatelyPhobosWithURL:(NSString *)url data:(id)data { - (void)sendImmediatelyPhobosWithURL:(NSString *)url data:(id)data {
dispatch_semaphore_wait(_immediatelySemaphore, DISPATCH_TIME_FOREVER); dispatch_async(_immediatelyQueue, ^{
__block NSMutableDictionary *dataDict = [[GMCache fetchObjectAtDocumentPathWithkey:PhobosImmediatelyCacheKey] mutableCopy]; dispatch_semaphore_wait(_immediatelySemaphore, DISPATCH_TIME_FOREVER);
dataDict = [self dataDict:dataDict setObject:data forKey:url]; __block NSMutableDictionary *dataDict = [[GMCache fetchObjectAtDocumentPathWithkey:PhobosImmediatelyCacheKey] mutableCopy];
dataDict = [self dataDict:dataDict setObject:data forKey:url];
NSInteger allCount = dataDict.allKeys.count;// 请求个数
__block finishCount = 0;// 请求完成次数,不是请求成功次数,能在最后保证未发送成功的数据,能一次保存下来,等待下次发送 NSInteger allCount = dataDict.allKeys.count;// 请求个数
__block finishCount = 0;// 请求完成次数,不是请求成功次数,能在最后保证未发送成功的数据,能一次保存下来,等待下次发送
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);// 因为网络请求是异步回调,需要保证数据安全
[dataDict enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSArray * _Nonnull obj, BOOL * _Nonnull stop) { dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);// 因为网络请求是异步回调,需要保证数据安全
[self sendDataWithAPI:key data:obj successBlock:^(NSInteger code) { [dataDict enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSArray * _Nonnull obj, BOOL * _Nonnull stop) {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); [self sendDataWithAPI:key data:obj successBlock:^(NSInteger code) {
finishCount++; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
if (code == 200) {// 如果数据请求成功,删除当前数据的缓存 finishCount++;
[dataDict removeObjectForKey:key]; if (code == 200) {// 如果数据请求成功,删除当前数据的缓存
} [dataDict removeObjectForKey:key];
if (finishCount == allCount) {// 所有数据都请求完成,重新进行数据缓存 }
[GMCache storeObjectAtDocumentPathWithkey:PhobosImmediatelyCacheKey object:dataDict]; if (finishCount == allCount) {// 所有数据都请求完成,重新进行数据缓存
dispatch_semaphore_signal(_immediatelySemaphore); [GMCache storeObjectAtDocumentPathWithkey:PhobosImmediatelyCacheKey object:dataDict];
} dispatch_semaphore_signal(_immediatelySemaphore);
dispatch_semaphore_signal(semaphore); }
phobosLog(@"✈ ---------- ✈ data arrived Mars"); dispatch_semaphore_signal(semaphore);
phobosLog(@"✈ ---------- ✈ data arrived Mars");
}];
}]; }];
}]; });
} }
/** /**
...@@ -555,7 +563,13 @@ static dispatch_semaphore_t _normalSemaphore; ...@@ -555,7 +563,13 @@ static dispatch_semaphore_t _normalSemaphore;
// [self verifyPVPhobos:dataArray data:object]; // [self verifyPVPhobos:dataArray data:object];
//#endif //#endif
[dataArray addObjectsFromArray:data]; [dataArray addObjectsFromArray:data];
[dataDict setValue:dataArray forKey:key]; // 进行数据校验
@try {
NSData *json = [PhobosUtil encodeJSON:dataArray];
[dataDict setValue:dataArray forKey:key];
} @catch (NSException *exception) {
NSAssert(NO, @"哎呀呀,VALUE只不能为NSObject ");
}
return dataDict; return dataDict;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment