【问题标题】:React Native AsyncStorage unable to see updated data from javascript when stored from native code从本机代码存储时,React Native AsyncStorage 无法查看来自 javascript 的更新数据
【发布时间】: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) { ... });

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

我知道我的用例并不是非常标准,但这似乎是一个合理的尝试。关于我如何能够读取从本机代码中持久保存的值,而无需重新启动应用程序有什么想法吗?

【问题讨论】:

    标签: ios objective-c react-native


    【解决方案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 对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2021-02-05
      • 2017-02-26
      • 2016-11-22
      相关资源
      最近更新 更多