在 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 的 同步 部分。
如何在 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 的 同步 部分。