Просмотр исходного кода

Support a customizable limit on the network response cache.

Ryan Olson лет назад: 11
Родитель
Сommit
719c641692
2 измененных файлов с 23 добавлено и 0 удалено
  1. 3 0
      Classes/Network/FLEXNetworkRecorder.h
  2. 20 0
      Classes/Network/FLEXNetworkRecorder.m

+ 3 - 0
Classes/Network/FLEXNetworkRecorder.h

@@ -20,6 +20,9 @@ extern NSString *const kFLEXNetworkRecorderUserInfoTransactionKey;
 /// In general, it only makes sense to have one recorder for the entire application.
 + (instancetype)defaultRecorder;
 
+/// Defaults to 50 MB if never set. Values set here are presisted across launches of the app.
+@property (nonatomic, assign) NSUInteger responseCacheByteLimit;
+
 // Accessing recorded network activity
 
 /// Array of FLEXNetworkTransaction objects ordered by start time with the newest first.

+ 20 - 0
Classes/Network/FLEXNetworkRecorder.m

@@ -15,6 +15,8 @@ NSString *const kFLEXNetworkRecorderNewTransactionNotification = @"kFLEXNetworkR
 NSString *const kFLEXNetworkRecorderTransactionUpdatedNotification = @"kFLEXNetworkRecorderTransactionUpdatedNotification";
 NSString *const kFLEXNetworkRecorderUserInfoTransactionKey = @"transaction";
 
+NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.responseCacheLimit";
+
 @interface FLEXNetworkRecorder ()
 
 @property (nonatomic, strong) NSCache *responseCache;
@@ -31,6 +33,13 @@ NSString *const kFLEXNetworkRecorderUserInfoTransactionKey = @"transaction";
     self = [super init];
     if (self) {
         self.responseCache = [[NSCache alloc] init];
+        NSUInteger responseCacheLimit = [[[NSUserDefaults standardUserDefaults] objectForKey:kFLEXNetworkRecorderResponseCacheLimitDefaultsKey] unsignedIntegerValue];
+        if (responseCacheLimit) {
+            [self.responseCache setTotalCostLimit:responseCacheLimit];
+        } else {
+            // Default to 50 MB max. The cache will purge earlier if there is memory pressure.
+            [self.responseCache setTotalCostLimit:50 * 1024 * 1024];
+        }
         self.orderedTransactions = [NSMutableArray array];
         self.networkTransactionsForRequestIdentifiers = [NSMutableDictionary dictionary];
         self.queue = dispatch_queue_create("com.flex.FLEXNetworkRecorder", DISPATCH_QUEUE_CONCURRENT);
@@ -50,6 +59,17 @@ NSString *const kFLEXNetworkRecorderUserInfoTransactionKey = @"transaction";
 
 #pragma mark - Public Data Access
 
+- (NSUInteger)responseCacheByteLimit
+{
+    return [self.responseCache totalCostLimit];
+}
+
+- (void)setResponseCacheByteLimit:(NSUInteger)responseCacheByteLimit
+{
+    [self.responseCache setTotalCostLimit:responseCacheByteLimit];
+    [[NSUserDefaults standardUserDefaults] setObject:@(responseCacheByteLimit) forKey:kFLEXNetworkRecorderResponseCacheLimitDefaultsKey];
+}
+
 - (NSArray *)networkTransactions
 {
     __block NSArray *transactions = nil;