C++ 当c++;已触发回调函数
我希望在.cpp函数中发生更改或触发事件时通知swift代码 我的应用程序中有以下结构 (.cpp)[.hpp]->(.mm)[.h]->.swift 我可以通过以下方式处理swift代码中的changeThisString:C++ 当c++;已触发回调函数,c++,ios,objective-c,swift,objective-c++,C++,Ios,Objective C,Swift,Objective C++,我希望在.cpp函数中发生更改或触发事件时通知swift代码 我的应用程序中有以下结构 (.cpp)[.hpp]->(.mm)[.h]->.swift 我可以通过以下方式处理swift代码中的changeThisString: let swiftString = CPPWrapper().MyMethodWrapper() 点击按钮/ VIELDDIAD,这是可以的,但是每当我从C++中设置这个值时,我想更新这个值。 我真的很高兴能得到任何帮助,谢谢 例如: my.cpp: std::str
let swiftString = CPPWrapper().MyMethodWrapper()
点击按钮/ VIELDDIAD,这是可以的,但是每当我从C++中设置这个值时,我想更新这个值。 <如果C++将新字符串传递给SWIFT,则不应该等待按钮点击,它应该像听者一样工作。< /P> 我真的很高兴能得到任何帮助,谢谢
例如: my.cpp:std::string changeThisString = "";
...
virtual void myCallBack(MyCallBackParam ¶mter){
changeThisString = "I WANT TO SEE THIS MESSAGE ON MY APP!"
}
std::string MyClass::MyMethod() {
return changeThisString;
}
#include <string>
class MyClass{
public:
std::string MyMethod();
};
my.hpp:
std::string changeThisString = "";
...
virtual void myCallBack(MyCallBackParam ¶mter){
changeThisString = "I WANT TO SEE THIS MESSAGE ON MY APP!"
}
std::string MyClass::MyMethod() {
return changeThisString;
}
#include <string>
class MyClass{
public:
std::string MyMethod();
};
Wrapper.h
#import <Foundation/Foundation.h>
@interface CPPWrapper : NSObject
-(NSString*) MyMethodWrapper;
@end
这是一个触发联合通知的C回调示例。 (在GitHub上移动到此处:) 此示例更改C库中C字符串的值,并将其显示在SwiftUI视图的字段中 你不需要通过Objective-C
- 第二部分是CSwift类
MyCLibraryInterface
执行此任务
这个类是一个可观察的对象,它将使用combine发布值更改,所以它有点超出了问题的范围-一旦进入回调块,您就可以停在那里做您想做的事情。注意,我们无法在c调用中捕获swift上下文(没有对self的调用或堆上声明的变量)
- 第三部分是一个简单的SwiftUI应用程序,它接收更改和更新界面
- MyCLibrary.h
\ifndef MyCLibrary\h
#定义MyCLibrary_h
#包括
#包括
#包括
///更改字符串时要调用的回调
typedef void callback_t(常量字符*字符串);
void setCallBack(callback\u t\u callback);
///将更改字符串的函数
无效设置字符串(常量字符*字符串);
void startTimer(void);
作废取消计时器(作废);
#endif/*MyCLibrary\h*/
- MyCLibrary.c
#包括“MyCLibrary.h”
const char*myString;
调度队列;
调度源定时器;
布尔跑;
回调_t*回调;
void setCallBack(callback\u t\u callback){
回调=_回调;
}
无效设置字符串(常量字符*字符串){
myString=string;
回调(myString);
}
///一个函数,它将启动一个改变字符串的计时器
int ticks=0;
无效空闲(调度源定时器)
{
ticks++;
char tickstr[32];
sprintf(滴答声,“时间:%ds”,滴答声);
设置管柱(tickstr);
}
void startTimer(){
如果(正在运行){cancelTimer();sleep(1);}
队列=调度队列创建(“timerQueue”,0);
//创建调度计时器源
定时器=调度\源\创建(调度\源\类型\定时器,0,0,队列);
调度_源_集_事件_处理程序(计时器,^{idle(计时器);});
调度\u源\u集\u取消\u处理程序(计时器^{
调度释放(计时器);
调度释放(队列);
});
调度时间\u t开始=调度时间(调度时间\u现在,0);
//设定计时器
调度源设置定时器(定时器,启动,每秒NSEC,0);
滴答声=0;
运行=真;
调度恢复(计时器);
}
void cancelTimer(){
运行=错误;
调度源取消(定时器);
char tickstr[32];
sprintf(滴答声,“在%ds之后取消”,滴答声);
设置管柱(tickstr);
}
CSwift部分
let swiftString = CPPWrapper().MyMethodWrapper()
- MyApp桥接头.h
#导入“MyCLibrary.h”
- MyCLibraryInterface.swift
setString
函数,调用swift回调,并在修改ObserveObject
后更新视图
导入快捷界面
结构ContentView:View{
@ObservedObject var myCLibInterface:MyCLibraryInterface=MyCLibraryInterface.shared
var body:一些观点{
VStack{
Text(myCLibInterface.string).frame(宽度:150).padding()
按钮(“重置”){
setLibString(字符串:“C定时器示例”)
}.padding()
按钮(“启动计时器”){
myCLibInterface.startibtimer()
}.padding()
按钮(“取消”){
myCLibInterface.CancelibTimer()的
}.padding()
}.填充(20)
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}
谢谢,但我已经可以用这种方式来分享我的分享内容了,我想用类似于观察者的方式来代替等待按钮的点击,它应该直接改变。StStand不是我想要的,而且通过SWIFT在C++中使用回调线程是不容易的。无论如何,谢谢你。这里的按钮只是一个触发C函数的示例。对不起,我应该给出一个更具体的答案。如果你做一个计时器