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

Posted

技术标签:

【中文标题】从本机代码存储时,React Native AsyncStorage 无法查看来自 javascript 的更新数据【英文标题】:React Native AsyncStorage unable to see updated data from javascript when stored from native code 【发布时间】:2018-03-14 18:46:45 【问题描述】:

我从我的目标 C 代码中将值持久化到异步存储,如下所示:

  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】:

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

我的想法是,通常我可能想要访问同一个存储对象,而不是在 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 对象。

那里有大量关于如何做到这一点的信息,但我想我会提到它以防它对任何人有用。

【讨论】:

以上是关于从本机代码存储时,React Native AsyncStorage 无法查看来自 javascript 的更新数据的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 React Native 的异步存储从本地存储中获取值吗?

Realm React-Native:从 JS(反应本机代码)和 android(java)访问相同的领域

React-Native 的 Native 端能否向 React 请求信息? (桥接/本机模块)

react-native 应用程序视图加载时,如何在本机 ıos 上调用 ViewController 类?

在 Web 平台上使用异步存储运行反应本机项目时出错

React Native:本机模块不返回任何内容