2

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

我理解了使用 Bolts BFTask 对 DynamoDB 的异步访问,如下所示,但我需要“同步”连接。

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

我在“DynamoQuery”类中调用了“ddbIDQuery”方法,但它返回(null),因为 Bolts 异步事务?获得结果的最佳方法是什么?

// 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;
}
4

2 回答 2

3

BFTask有一个方法被调用- waitUntilFinished以使其成为同步方法;但是,如果可能的话,你应该避免它。有关更多详细信息,请参阅我们博客的同步部分。

于 2015-09-02T18:24:14.930 回答
0

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

但是,如果异步代码在不同的线程上执行,您可以为此目的使用信号量。(不仅是通过运行循环分派的“伪异步”。)

// 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.
于 2015-09-02T10:23:13.520 回答