gpt4 book ai didi

ios - 在 Swift 中继续之前等待 Objective-C 函数的结果

转载 作者:行者123 更新时间:2023-11-29 11:56:35 25 4
gpt4 key购买 nike

我有一个 swift 应用程序。主类 viewdidload 调用一个 objective-c 函数。

objective-c 函数扫描数据库,然后将其放入 NSMutableArray。

我需要在 swift 函数中使用 NSMutable 数组。

问题是这样的:我在 swift 中调用了 objective-c 函数,然后使用数组,但它在数组被填充之前就使用了它(nil)。

所以我需要 swift 在读取数组之前等待 objective-c 函数的成功返回值。

我见过多个例子,但不是从一种语言到另一种语言。有些人说使用完成处理程序其他人说这不是最好的方法。然后其他人说通知。

我是 IOS 新手,非常感谢您的帮助。

编辑添加的代码

scanTable 函数( Objective-C ):

#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

主要功能(Swift):

override func viewDidLoad() {
super.viewDidLoad()

let scanTable = ScanTable();
scanTable.scanTableDo();

let swiftArray = scanTable.scanResult
}

最佳答案

问题在于这是一个异步函数,而您正试图以同步方式访问结果。您需要 objective-c 函数来使用一个 block ,以便您可以在它完成时访问它:

- (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;

关于ios - 在 Swift 中继续之前等待 Objective-C 函数的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38844211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com