我有一个swift应用程序。主类viewdidload调用一个objective-c函数。
objective-c函数扫描数据库,然后把它放入NSMutableArray。
我需要在swift函数中使用NSMutable数组
问题是:我在swift中调用objective-c函数,然后使用数组,但它在填充(nil)之前使用数组。
所以我需要swift等待一个成功的返回值从objective-c函数之前演唱数组。
我看过很多例子,但不是从一种语言到另一种语言。有人说使用完成处理程序有人说这不是最好的方法。然后其他人说通知。
我是IOS新手,非常感谢您的帮助。
编辑添加代码
scanTable函数:
#import "ScanTable.h"
#import "Mapper.h"
@implementation ScanTable
- (void) scanTableDo {
AWSDynamoDBObjectMapper *dynamoDBObjectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];
AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];
scanExpression.limit = @10;
[[dynamoDBObjectMapper scan:[Mapper class]
expression:scanExpression]
continueWithBlock:
^id(AWSTask *task) {
if (task.error) {
NSLog(@"The request failed. Error: [%@]", task.error);
}
if (task.exception) {
NSLog(@"The request failed. Exception: [%@]", task.exception);
}
if (task.result) {
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSMutableArray *scanResult = [[NSMutableArray alloc] initWithArray:paginatedOutput.items]; //// ADDED /////
}
return nil;
}];
}
@end
Main函数(Swift):
override func viewDidLoad() {
super.viewDidLoad()
let scanTable = ScanTable();
scanTable.scanTableDo();
let swiftArray = scanTable.scanResult
}
问题是这是一个异步函数,而您正试图以同步方式访问结果。你需要objective - c函数使用一个块,这样你就可以在它完成后访问它:
- (void)scanTableDoWithBlock:(void(^)(NSArray *scanResult, NSError *error))handler {
AWSDynamoDBObjectMapper *dynamoDBObjectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];
AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];
scanExpression.limit = @10;
[[dynamoDBObjectMapper scan:[Mapper class]
expression:scanExpression]
continueWithBlock:^id(AWSTask *task) {
if (task.error) {
NSLog(@"The request failed. Error: [%@]", task.error);
if (handler != nil) {
handler(nil, task.error);
}
}
if (task.exception) {
NSLog(@"The request failed. Exception: [%@]", task.exception);
}
if (task.result) {
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSMutableArray *scanResult = [[NSMutableArray alloc] initWithArray:paginatedOutput.items]; //// ADDED /////
if (handler != nil) {
handler([scanResult copy], nil);
}
}
return nil;
}];
}
确保将.h文件中的方法声明更改为:
- (void)scanTableDo;
:
- (void)scanTableDoWithBlock:(void(^)(NSArray *scanResult, NSError *error))handler;