从本机代码存储时,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 请求信息? (桥接/本机模块)