我可以在统一包装器中调用包含块的 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];
这样,一切都被正确保留了。
编码愉快~
我在 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];
这样,一切都被正确保留了。
编码愉快~