我可以在统一包装器中调用包含块的 iOS 代码吗?

Can I call iOS code that contains blocks in a unity wrapper?

我在 Objective-C 中有一个方法进入 NSOperationQueue 和 returns 与块异步。

例如

+ (void)getDataFromServer:(void(^)(NSArray *data, NSError *error))block;

所以当我尝试使用我的 Objective-C++ 包装器调用它时,

void get_data(const char *GameObjectName, const char *DataCallback,const char *ErrorCallback){
    [LibraryClass getDataFromServer:^(NSArray *data, NSError *error) {
        if (data) {
             UnitySendMessage(GameObjectName, DataCallback, [[data componentsJoinedByString:@","] UTF8String]);
        }
        if (error) {
            UnitySendMessage(GameObjectName, ErrorCallback, [[error localizedDescription] UTF8String]);
        }
    }];
}

如果我在代码块之前设置断点,字符串 (const char *) 会很好地填充,但是如果我在代码块的 if (data) {} 部分设置断点,变量就会被修改,看起来像随机数据。当然,UnityMessageSend() 失败是因为找不到对象。

我这样做的方式正确吗?我怀疑我已经忘记或没有意识到一些 block/C/C++ 警告。

理想情况下,你会 post - [MyClass getDataFromServer:] 的实现,但至少你想按照@nielsbot 的建议将块从堆栈复制到堆,使用 -copy:

void get_data(const char *GameObjectName, const char *DataCallback,const char *ErrorCallback){
    [LibraryClass getDataFromServer:[^(NSArray *data, NSError *error) {
        if (data) {
             UnitySendMessage(GameObjectName, DataCallback, [[data componentsJoinedByString:@","] UTF8String]);
        }
        if (error) {
            UnitySendMessage(GameObjectName, ErrorCallback, [[error localizedDescription] UTF8String]);
        }
    } copy]];   // <-- call the block's -copy method here
}

CoreInt Slack Channel 中用 Erik price 解决了,但我想我应该把它写在这里:

我们通过参考 class

解决了这个问题

@property (nonatomic, copy) void (^myBlock)(NSError *error);

然后调用时初始化

self.myBlock = ^{...}; 然后这样称呼它 [MyClass getDataFromServer:self.myBlock];

这样,一切都被正确保留了。

编码愉快~