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



我有一个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;

相关内容

  • 没有找到相关文章

最新更新