在 Objective-c 中同步连接到 AWS DynamoDB

Synchronous connecting to AWS DynamoDB in Objective-c

如何在 Objective-c 中实现对 AWS DynamoDB 的同步访问?

我了解使用 Bolts BFTask 异步访问 DynamoDB,如下所示,但我需要 "synchronous" 连接。

----添加了一些信息----

我在 "DynamoQuery" class 中调用了 "ddbIDQuery" 方法,但由于 Bolts 异步事务,它返回了(null)? 获得结果的最佳方式是什么?

// MainViewController.m

#import "DynamoQuery.h"

-(IBAction)ddqButton:(UIButton *)sender
{
    // call DynamoQuery
    DynamoQuery *dynamoQuery = [[DynamoQuery alloc] init];
    NSLog(@"dynamoQuery: %@", [dynamoQuery ddbIDQuery:@"448898329-6BC0FA0A954913043A3281599A444E3C"]);
}


// DynamoQuery.m

- (NSString *) ddbIDQuery: (NSString*)ddbID
{
    __block NSString *strpid = nil;

    AWSDynamoDBObjectMapper *dynamoDBObjectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];
    [[dynamoDBObjectMapper load:[PIDTable class] hashKey:ddbID rangeKey:nil] continueWithBlock:^id(AWSTask *task)
     {
         NSLog(@"ddbID: %@", ddbID);
         if (task.error){
             NSLog(@"The 1st request failed. Error: [%@]", task.error);
         }
         if (task.exception) {
             NSLog(@"The 1st request failed. Exception: [%@]", task.exception);
         }
         if (task.result) {
             PIDTable *ddbpid = task.result;
             NSData *datapid = [ddbpid.text dataUsingEncoding:NSUTF8StringEncoding];
             strpid = [[NSString alloc] initWithData:datapid encoding:NSUTF8StringEncoding];
         };
         return nil;
     }
     ];
     return strpid;
}

在大多数情况下,您不需要同步访问。您只是不了解异步代码执行的复杂性。但我当然不知道,这是否适用于你的情况。

但是,如果异步代码在不同的线程上执行,您可以为此目的使用信号量。 (不仅 "pseudo-asynchronous" 通过 运行 循环调度。)

// Create a semaphore
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // No concurrency at all

[[dynamoDBObjectMapper load:[PIDTable class] hashKey:ddbid rangeKey:nil] continueWithBlock:^id(AWSTask *task)
{
     …
     // Signal that work is done
    dispatch_semaphore_signal(semaphore); // done

    return nil;
}
];

// Wait for signal
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // Probably you do not want to wait for ever.

BFTask 有一个名为 - waitUntilFinished 的方法使其成为同步方法;但是,您应该尽可能避免使用它。有关详细信息,请参阅 our blog 同步 部分。