Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当c++;已触发回调函数_C++_Ios_Objective C_Swift_Objective C++ - Fatal编程技术网

C++ 当c++;已触发回调函数

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

我希望在.cpp函数中发生更改或触发事件时通知swift代码

我的应用程序中有以下结构

(.cpp)[.hpp]->(.mm)[.h]->.swift

我可以通过以下方式处理swift代码中的changeThisString:

let swiftString = CPPWrapper().MyMethodWrapper()

点击按钮/ VIELDDIAD,这是可以的,但是每当我从C++中设置这个值时,我想更新这个值。 <如果C++将新字符串传递给SWIFT,则不应该等待按钮点击,它应该像听者一样工作。< /P> 我真的很高兴能得到任何帮助,谢谢

例如:

my.cpp:

std::string changeThisString = "";

...

virtual void myCallBack(MyCallBackParam &paramter){
    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 &paramter){
    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

    < P>第一部分是C库(很少用C++进行更改)

  • 第二部分是CSwift类

我认为有一个对象在C代码和swift应用程序之间架起桥梁,从应用程序代码中删除深奥的语法,这很好。在本例中,文件
MyCLibraryInterface
执行此任务

这个类是一个可观察的对象,它将使用combine发布值更改,所以它有点超出了问题的范围-一旦进入回调块,您就可以停在那里做您想做的事情。注意,我们无法在c调用中捕获swift上下文(没有对self的调用或堆上声明的变量)

  • 第三部分是一个简单的SwiftUI应用程序,它接收更改和更新界面
C库

  • 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
<代码>导入基础 类MyCLibraryInterface:ObservableObject{ @已发布的变量字符串:string=“这是一个字符串” 静态let shared=MyCLibraryInterface() init(){ setCallBack{stringPtr in 将newString=CFStringCreateWithCString(kCFAllocatorDefault、stringPtr、kCFStringEncodingASCII)设为CFString DispatchQueue.main.async{ MyCLibraryInterface.shared.string=新闻字符串作为字符串 } } } func setLibString(string:string){ string.withCString{stringPointer in 设置字符串(字符串指针) } } func stackibtimer(){ startTimer() } func cancelibtimer(){ 取消计时器() } } SwiftUI样本

此示例应用程序显示初始字符串和按钮。单击或轻触,将在CLibrary中调用
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函数的示例。对不起,我应该给出一个更具体的答案。如果你做一个计时器