当从本机代码存储时,React Native AsyncStorage无法从javascript中查看更新的数据

时间:2018-03-14 18:46:45

标签: ios objective-c react-native

我从我的客观C代码中持久保存Async Storage的值:

  dispatch_async(self.storage.methodQueue, ^{
    if ([self.storage respondsToSelector:@selector(multiSet:callback:)]) {      
      [self.storage performSelector:@selector(multiSet:callback:) withObject:@[@[@"MYKEY", @"MYVALUE"]] withObject:[^(NSArray* response) {
        NSLog(@"Contents: %@",response);
      } copy]];
    }else{
      NSLog(@"storage does not respond!!!");
    }
  });

这实际上非常有效,除了前端在我关闭并重新启动应用程序之前似乎无法看到这些值。

当我尝试从前端读取值时:

AsyncStorage.getItem('MYKEY', function(err, result) { ... });

我总是得到应用程序启动前的值。

我知道我的用例并不是非常标准,但这似乎是一件合理的事情。有关如何读取本机代码中持久存储的值而不必重新启动应用程序的任何想法?

1 个答案:

答案 0 :(得分:0)

我能够在没有完全理解根本原因的情况下解决问题。如果有人能够找到解释,请分享。

我的想法是,通常我可能想要访问相同的存储对象,而不是使用Objective C中的一个和javascript中的一个。所以我所做的是创建一个包含以下内容的NativeBridge.m文件:

#import "NativeBridge.h"
#import "StorageManager.h"

@implementation NativeBridge

RCT_EXPORT_MODULE()

RCT_EXPORT_METHOD(getMeasurements:(RCTResponseSenderBlock)callback) {

  RCTAsyncLocalStorage* storage = [[StorageManager sharedManager] storage];

  dispatch_async(storage.methodQueue, ^{
    if ([storage respondsToSelector:@selector(multiGet:callback:)]) {
      [storage performSelector:@selector(multiGet:callback:) withObject:@[@"measurements"] withObject:[^(NSArray* response) {
        callback(@[response[1][0][1]]);
      } copy]];
    }else{
      NSLog(@"storage does not respond!!!");
    }
  });
}

@end

和相应的头文件:

#import <React/RCTBridgeModule.h>
#import <React/RCTAsyncLocalStorage.h>

@interface NativeBridge : NSObject <RCTBridgeModule>

@end

这样我可以直接从javascript:

通过我自己的导出方法进行调用
import { NativeBridge } from 'NativeModules';

NativeBridge.getMeasurements(response => { ... });

其他实施信息

我使用的模式(可能不一定是必需的)是使用本机代码中的标准单例模式来容纳RCTAsyncLocalStorage对象。

有很多关于如何做到这一点的信息,但我想如果它对任何人都有用,我会提及它。