首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在iOS上,AsyncStorage由本机代码支持,本机代码在序列化字典中存储小值,在单独的文件中存储更大的值。

在iOS上,AsyncStorage由本机代码支持,本机代码在序列化字典中存储小值,在单独的文件中存储更大的值。
EN

Stack Overflow用户
提问于 2016-12-12 08:30:32
回答 1查看 280关注 0票数 0

标题是在官方网站上的介绍。但我有个问题。有人能解释“小”和“大”吗?在编程中,如果我有一个包含20个对象的模型。我应该将模型保存在20个单独的键值对中,还是只保存在一个对中?哪一个更有效率?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-12 12:10:42

我刚刚深入研究了RCTAsyncLocalStorage的源代码,特别是这个块:

代码语言:javascript
复制
- (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL *)changedManifest
{
  if (entry.count != 2) {
    return RCTMakeAndLogError(@"Entries must be arrays of the form [key: string, value: string], got: ", entry, nil);
  }
  NSString *key = entry[0];
  NSDictionary *errorOut = RCTErrorForKey(key);
  if (errorOut) {
    return errorOut;
  }
  NSString *value = entry[1];
  NSString *filePath = [self _filePathForKey:key];
  NSError *error;
  if (value.length <= RCTInlineValueThreshold) {
    if (_manifest[key] == (id)kCFNull) {
      // If the value already existed but wasn't inlined, remove the old file.
      [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
      [RCTGetCache() removeObjectForKey:key];
    }
    *changedManifest = YES;
    _manifest[key] = value;
    return nil;
  }

[value writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];

其中RCTInlineValueThreshold在(来源)之前定义为以下几行:

static const NSUInteger RCTInlineValueThreshold = 1024;

因此,小于或等于1024的值(您的对象将被序列化为字符串)将存储在序列化字典中,更大的对象存储在单独的文件中。

至于将对象扩展到n个键值对,它可能会影响性能,因为您必须对存储执行n个查询(涉及从JS到本机的通信,反之亦然,这是一个昂贵的操作),但它也可能取决于数据被查询的频率以及查询的方式(例如,如果一个对象经常被查询,而其他对象不被查询,那么为了避免长字符串的序列化和反序列化,拆分它们可能是有意义的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41096819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档