@@ -43,6 +43,18 @@ static void RCTAppendError(NSDictionary *error, NSMutableArray<NSDictionary *> *
43
43
}
44
44
}
45
45
46
+ static NSArray <NSDictionary *> *RCTMakeErrors (NSArray <id <NSObject >> *results) {
47
+ NSMutableArray <NSDictionary *> *errors;
48
+ for (id object in results) {
49
+ if ([object isKindOfClass: [NSError class ]]) {
50
+ NSError *error = (NSError *)object;
51
+ NSDictionary *keyError = RCTMakeError (error.localizedDescription , error, nil );
52
+ RCTAppendError (keyError, &errors);
53
+ }
54
+ }
55
+ return errors;
56
+ }
57
+
46
58
static NSString *RCTReadFile (NSString *filePath, NSString *key, NSDictionary **errorOut)
47
59
{
48
60
if ([[NSFileManager defaultManager ] fileExistsAtPath: filePath]) {
@@ -329,30 +341,77 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
329
341
return errorOut;
330
342
}
331
343
344
+ - (void )_multiGet : (NSArray <NSString *> *)keys
345
+ callback : (RCTResponseSenderBlock)callback
346
+ getter : (NSString *(^)(NSUInteger i, NSString *key, NSDictionary **errorOut))getValue
347
+ {
348
+ NSMutableArray <NSDictionary *> *errors;
349
+ NSMutableArray <NSArray <NSString *> *> *result = [NSMutableArray arrayWithCapacity: keys.count];
350
+ for (NSUInteger i = 0 ; i < keys.count ; ++i) {
351
+ NSString *key = keys[i];
352
+ id keyError;
353
+ id value = getValue (i, key, &keyError);
354
+ [result addObject: @[key, RCTNullIfNil (value)]];
355
+ RCTAppendError (keyError, &errors);
356
+ }
357
+ callback (@[RCTNullIfNil (errors), result]);
358
+ }
359
+
332
360
#pragma mark - Exported JS Functions
333
361
334
362
RCT_EXPORT_METHOD (multiGet:(NSArray <NSString *> *)keys
335
363
callback:(RCTResponseSenderBlock)callback)
336
364
{
365
+ if (self.delegate != nil ) {
366
+ [self .delegate valuesForKeys: keys completion: ^(NSArray <id <NSObject >> *valuesOrErrors) {
367
+ [self _multiGet: keys
368
+ callback: callback
369
+ getter: ^NSString *(NSUInteger i, NSString *key, NSDictionary **errorOut) {
370
+ id valueOrError = valuesOrErrors[i];
371
+ if ([valueOrError isKindOfClass: [NSError class ]]) {
372
+ NSError *error = (NSError *)valueOrError;
373
+ NSDictionary *extraData = @{@" key" : RCTNullIfNil (key)};
374
+ *errorOut = RCTMakeError (error.localizedDescription , error, extraData);
375
+ return nil ;
376
+ } else {
377
+ return [valueOrError isKindOfClass: [NSString class ]]
378
+ ? (NSString *)valueOrError
379
+ : nil ;
380
+ }
381
+ }];
382
+ }];
383
+ return ;
384
+ }
385
+
337
386
NSDictionary *errorOut = [self _ensureSetup ];
338
387
if (errorOut) {
339
388
callback (@[@[errorOut], (id )kCFNull ]);
340
389
return ;
341
390
}
342
- NSMutableArray <NSDictionary *> *errors;
343
- NSMutableArray <NSArray <NSString *> *> *result = [[NSMutableArray alloc ] initWithCapacity: keys.count];
344
- for (NSString *key in keys) {
345
- id keyError;
346
- id value = [self _getValueForKey: key errorOut: &keyError];
347
- [result addObject: @[key, RCTNullIfNil (value)]];
348
- RCTAppendError (keyError, &errors);
349
- }
350
- callback (@[RCTNullIfNil (errors), result]);
391
+ [self _multiGet: keys
392
+ callback: callback
393
+ getter: ^(NSUInteger i, NSString *key, NSDictionary **errorOut) {
394
+ return [self _getValueForKey: key errorOut: errorOut];
395
+ }];
351
396
}
352
397
353
398
RCT_EXPORT_METHOD (multiSet:(NSArray <NSArray <NSString *> *> *)kvPairs
354
399
callback:(RCTResponseSenderBlock)callback)
355
400
{
401
+ if (self.delegate != nil ) {
402
+ NSMutableArray <NSString *> *keys = [NSMutableArray arrayWithCapacity: kvPairs.count];
403
+ NSMutableArray <NSString *> *values = [NSMutableArray arrayWithCapacity: kvPairs.count];
404
+ for (NSArray <NSString *> *entry in kvPairs) {
405
+ [keys addObject: entry[0 ]];
406
+ [values addObject: entry[1 ]];
407
+ }
408
+ [self .delegate setValues: values forKeys: keys completion: ^(NSArray <id <NSObject >> *results) {
409
+ NSArray <NSDictionary *> *errors = RCTMakeErrors (results);
410
+ callback (@[RCTNullIfNil (errors)]);
411
+ }];
412
+ return ;
413
+ }
414
+
356
415
NSDictionary *errorOut = [self _ensureSetup ];
357
416
if (errorOut) {
358
417
callback (@[@[errorOut]]);
@@ -373,6 +432,20 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
373
432
RCT_EXPORT_METHOD (multiMerge:(NSArray <NSArray <NSString *> *> *)kvPairs
374
433
callback:(RCTResponseSenderBlock)callback)
375
434
{
435
+ if (self.delegate != nil ) {
436
+ NSMutableArray <NSString *> *keys = [NSMutableArray arrayWithCapacity: kvPairs.count];
437
+ NSMutableArray <NSString *> *values = [NSMutableArray arrayWithCapacity: kvPairs.count];
438
+ for (NSArray <NSString *> *entry in kvPairs) {
439
+ [keys addObject: entry[0 ]];
440
+ [values addObject: entry[1 ]];
441
+ }
442
+ [self .delegate mergeValues: values forKeys: keys completion: ^(NSArray <id <NSObject >> *results) {
443
+ NSArray <NSDictionary *> *errors = RCTMakeErrors (results);
444
+ callback (@[RCTNullIfNil (errors)]);
445
+ }];
446
+ return ;
447
+ }
448
+
376
449
NSDictionary *errorOut = [self _ensureSetup ];
377
450
if (errorOut) {
378
451
callback (@[@[errorOut]]);
@@ -407,8 +480,16 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
407
480
}
408
481
409
482
RCT_EXPORT_METHOD (multiRemove:(NSArray <NSString *> *)keys
410
- callback:(RCTResponseSenderBlock)callback)
483
+ callback:(RCTResponseSenderBlock)callback)
411
484
{
485
+ if (self.delegate != nil ) {
486
+ [self .delegate removeValuesForKeys: keys completion: ^(NSArray <id <NSObject >> *results) {
487
+ NSArray <NSDictionary *> *errors = RCTMakeErrors (results);
488
+ callback (@[RCTNullIfNil (errors)]);
489
+ }];
490
+ return ;
491
+ }
492
+
412
493
NSDictionary *errorOut = [self _ensureSetup ];
413
494
if (errorOut) {
414
495
callback (@[@[errorOut]]);
@@ -439,6 +520,17 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
439
520
440
521
RCT_EXPORT_METHOD (clear:(RCTResponseSenderBlock)callback)
441
522
{
523
+ if (self.delegate != nil ) {
524
+ [self .delegate removeAllValues: ^(NSError *error) {
525
+ NSDictionary *result = nil ;
526
+ if (error != nil ) {
527
+ result = RCTMakeError (error.localizedDescription , error, nil );
528
+ }
529
+ callback (@[RCTNullIfNil (result)]);
530
+ }];
531
+ return ;
532
+ }
533
+
442
534
[_manifest removeAllObjects ];
443
535
[RCTGetCache () removeAllObjects ];
444
536
NSDictionary *error = RCTDeleteStorageDirectory ();
@@ -447,6 +539,13 @@ - (NSDictionary *)_writeEntry:(NSArray<NSString *> *)entry changedManifest:(BOOL
447
539
448
540
RCT_EXPORT_METHOD (getAllKeys:(RCTResponseSenderBlock)callback)
449
541
{
542
+ if (self.delegate != nil ) {
543
+ [self .delegate allKeys: ^(NSArray <id <NSObject >> *keys) {
544
+ callback (@[(id )kCFNull , keys]);
545
+ }];
546
+ return ;
547
+ }
548
+
450
549
NSDictionary *errorOut = [self _ensureSetup ];
451
550
if (errorOut) {
452
551
callback (@[errorOut, (id )kCFNull ]);
0 commit comments