接触过libjingle库,感慨于它强大的功能.这里不在全部描述libjingle模块. 只是简单介绍下它两个模块(sigslot,MessageHandler).
sigslot主要用于对象的事件传递
Messagehandler是很好的异步触发处理机制.
至于两者概念非本文描述,本文侧重于两者的实际运用.
先在Xcode下新建个Test工程
1.加入所需要的文件.如下图
至于为什么只加入这这些文件,本人也没有搞懂,借鉴别人的.
2.工程设置里面
a. 设置Other Linker Flags选项
Other Linker Flags: -all_load -ObjC
b. 设置Header Search Paths 选项
例如我的项目中libjingle放在路径: $(SRCROOT)/Test/libjingle
要从网上下载完整的libjingle库
c:设置Other C++ Flags选项:
///begin-DV8_DEPRECATION_WARNINGS
-DEXPAT_RELATIVE_PATH
-DFEATURE_ENABLE_VOICEMAIL
-DGTEST_RELATIVE_PATH
-DJSONCPP_RELATIVE_PATH
-DFEATURE_ENABLE_PSTN
-DLOGGING=1
-DSRTP_RELATIVE_PATH
-DFEATURE_ENABLE_SSL
-DHAVE_SRTP
-DHAVE_WEBRTC_VIDEO
-DHAVE_WEBRTC_VOICE
-DUSE_WEBRTC_DEV_BRANCH
-DPSAPI_VERSION=1
-D_CRT_RAND_S
-DCERT_CHAIN_PARA_HAS_EXTRA_FIELDS
-D_ATL_NO_OPENGL
-D_HAS_EXCEPTIONS=0
-D_SECURE_ATL
-DCHROMIUM_BUILD
-DTOOLKIT_VIEWS=1
-DUSE_AURA=1
-DUSE_ASH=1
-DUSE_DEFAULT_RENDER_THEME=1
-DUSE_LIBJPEG_TURBO=1
-DENABLE_ONE_CLICK_SIGNIN
-DENABLE_REMOTING=1
-DENABLE_WEBRTC=1
-DENABLE_PEPPER_CDMS
-DENABLE_CONFIGURATION_POLICY
-DENABLE_INPUT_SPEECH
-DENABLE_NOTIFICATIONS
-DENABLE_EGLIMAGE=1
-D__STD_C
-DENABLE_TASK_MANAGER=1
-DENABLE_EXTENSIONS=1
-DENABLE_PLUGIN_INSTALLATION=1
-DENABLE_PLUGINS=1
-DENABLE_SESSION_SERVICE=1
-DENABLE_THEMES=1
-DENABLE_AUTOFILL_DIALOG=1
-DENABLE_BACKGROUND=1
-DENABLE_AUTOMATION=1
-DENABLE_GOOGLE_NOW=1
-DCLD_VERSION=2
-DENABLE_FULL_PRINTING=1
-DENABLE_PRINTING=1
-DENABLE_SPELLCHECK=1
-DENABLE_CAPTIVE_PORTAL_DETECTION=1
-DENABLE_APP_LIST=1
-DENABLE_SETTINGS_APP=1
-DENABLE_MANAGED_USERS=1
-DENABLE_MDNS=1
-DLIBPEERCONNECTION_LIB=1
-DHAVE_SCTP
-DSSL_USE_NSS
-DHAVE_NSS_SSL_H
-DSSL_USE_NSS_RNG
-DNSS_PLATFORM_CLIENT_AUTH
-DNO_NSPR_10_SUPPORT
-DNSPR_STATIC
-DNSS_ENABLE_ECC
-DNSS_STATIC
-DNSS_USE_STATIC_LIBS
-DUSE_UTIL_DIRECTLY
-DDYNAMIC_ANNOTATIONS_ENABLED=1
-DWTF_USE_DYNAMIC_ANNOTATIONS=1
-DPJ_IS_LITTLE_ENDIAN=1
-DPJ_IS_BIG_ENDIAN=0
-DPOSIX
-D_DEBUG
-DLIBCORE_EXPORTS
-D__STDC_CONSTANT_MACROS
-DV8_DEPRECATION_WARNINGS
-DEXPAT_RELATIVE_PATH
-DFEATURE_ENABLE_VOICEMAIL
-DGTEST_RELATIVE_PATH
-DJSONCPP_RELATIVE_PATH
-DLOGGING=1
-DSRTP_RELATIVE_PATH
-DFEATURE_ENABLE_SSL
-DFEATURE_ENABLE_PSTN
-DHAVE_SRTP
-DHAVE_WEBRTC_VIDEO
-DHAVE_WEBRTC_VOICE
-DUSE_WEBRTC_DEV_BRANCH
-D_FILE_OFFSET_BITS=64
-DCHROMIUM_BUILD
-DTOOLKIT_VIEWS=1
-DUI_COMPOSITOR_IMAGE_TRANSPORT
-DUSE_AURA=1
-DUSE_CAIRO=1
-DUSE_GLIB=1
-DUSE_DEFAULT_RENDER_THEME=1
-DUSE_LIBJPEG_TURBO=1
-DUSE_NSS=1
-DUSE_X11=1
-DUSE_CLIPBOARD_AURAX11=1
-DENABLE_ONE_CLICK_SIGNIN
-DUSE_XI2_MT=2
-DUSE_XI2_MT=2
-DENABLE_WEBRTC=1
-DENABLE_PEPPER_CDMS
-DENABLE_CONFIGURATION_POLICY
-DENABLE_INPUT_SPEECH
-DENABLE_NOTIFICATIONS
-DUSE_UDEV
-DENABLE_EGLIMAGE=1
-DENABLE_TASK_MANAGER=1
-DENABLE_EXTENSIONS=1
-DENABLE_PLUGIN_INSTALLATION=1
-DENABLE_PLUGINS=1
-DENABLE_SESSION_SERVICE=1
-DENABLE_THEMES=1
-DENABLE_AUTOFILL_DIALOG=1
-DENABLE_BACKGROUND=1
-DENABLE_AUTOMATION=1
-DENABLE_GOOGLE_NOW=1
-DCLD_VERSION=2
-DENABLE_FULL_PRINTING=1
-DENABLE_PRINTING=1
-DENABLE_SPELLCHECK=1
-DENABLE_CAPTIVE_PORTAL_DETECTION=1
-DENABLE_APP_LIST=1
-DENABLE_SETTINGS_APP=1
-DENABLE_MANAGED_USERS=1
-DENABLE_MDNS=1
-DLIBPEERCONNECTION_LIB=1
-DHAVE_SCTP
-DHASH_NAMESPACE=__gnu_cxx
-DPOSIX
-DDISABLE_DYNAMIC_CAST
-D_REENTRANT
-DSSL_USE_NSS
-DHAVE_NSS_SSL_H
-DSSL_USE_NSS_RNG
-DHAVE_INT16_T
-DHAVE_INT32_T
-DHAVE_INT8_T
-DHAVE_UINT16_T
-DHAVE_UINT32_T
-DHAVE_UINT64_T
-DHAVE_UINT8_T
-DHAVE_STDINT_H
-DHAVE_INTTYPES_H
-DHAVE_NETINET_IN_H
-DINLINE=inline
-DCPU_CISC
-DDYNAMIC_ANNOTATIONS_ENABLED=1
-DWTF_USE_DYNAMIC_ANNOTATIONS=1
-D_DEBUG
-D_GLIBCXX_DEBUG=1
-DIOS
-D__ARMEL__
-D_ARM_
-DNO_CRYPTO
-DNODEBUG
///end
3. 设置Build Phases的Compile Sources中的
maccocoathreadhelper.mm
scoped_autorelease_pool.mm文件为 -fno-objc-arc
原因在两个文件是为非ARC的,如果你的是非ARC,就略这一项
//至此引入库成功,编译没有问题了
4.工程介绍
网上讲解sigslot都是使用receive和sender为例子,我也借用下.同时实现了MessageHandler异步触发,说简单概要点就是post和OnMessage
//Receive.h
#include
#include
#include
#include "sigslot.h"
#include "thread.h"
#include "messagehandler.h"
#include "Sender.h"
class Receive :publicsigslot::has_slots<>,publictalk_base::MessageHandler {
public:
Receive(void);
~Receive();
enum {
Message_Init,
Message_Destory,
};
//初始化和销毁
void InitData(constchar *json);
void Destory();
//继承MessageHandler的消息处理
virtual void OnMessage(talk_base::Message* msg);
//sigslot事件 注册一个Event事件
/*注意这里的参数必须和Sender中的SignalEventContent参数个数匹配*/
void OnEvent(Sender* mysender,Sender::SenderStatus,int code, const std::string& content);
private:
talk_base::Thread *_receiveThread;
Sender* _sender;
};
//receive.cpp
#include "Receive.h"
Receive::Receive(void) {
_receiveThread &#61; new talk_base::Thread();
_receiveThread->SetName("ReceiveThread",_receiveThread);
_receiveThread->Start();
}
Receive::~Receive() {
//这里Post Message_Destory消息,通知释放资源
_receiveThread->Post(this,Message_Destory);
delete_receiveThread;
_receiveThread &#61; NULL;
}
void Receive::Destory() {
//释放资源
}
//外部接口,形参为json格式,支持任意参数接入
void Receive::InitData(constchar *json) {
//这里可以使用_myThread->Post(this,Message_Init)方式(类似Message_Destory)进一步初始化操作.不例举了.
//创建发送事件对象
_sender &#61; newSender();
//sender对象和receive对象建立连接
_sender->SignalEventContent.connect(this, &Receive::OnEvent);
}
void Receive::OnEvent(Sender *mysender,Sender::SenderStatus,int code,conststd::string& content) {
//事件响应接口.通过sigslot实现了sender对象中的事件传递到receive对象
}
void Receive::OnMessage(talk_base::Message *msg) {
switch (msg->message_id) {
caseMessage_Destory: {
Destory();
}
break;
}
}
//sender.h
#include
#include
#include
#include "sigslot.h"
#include "thread.h"
#include "messagehandler.h"
class Sender
:publicsigslot::has_slots<>,
publictalk_base::MessageHandler {
public:
Sender(void);
~Sender();
enum SenderStatus {
Sender_Init,
Sender_Destroy,
Sender_Event,
};
//signal4表示后面接4个参数,sigslot里面最多支持8个参数,要支持不同的参数使用signal0-8
/*4个参数分别表示:当前类指针,Status,code和content*/
sigslot::signal4
void OnNetWorkEvent(int code,const std::string& content);
//继承关系不能省略
virtual void OnMessage(talk_base::Message* msg);
private:
//talk_base::Thread *_senderThread;
};
//sender.cpp
#include "Sender.h"
Sender::Sender(void) {
/* _senderThread &#61; new talk_base::Thread();
_senderThread->SetName("SendThread", _senderThread);
_senderThread->Start();*/
}
Sender::~Sender() {}
void Sender::OnNetWorkEvent(int code,conststd::string& content) {
// 通过网络响应的事件接口(网络超时,接收数据接口)
//使用sigslot,使sender的对象传递事件
SignalEventContent(this,Sender_Event,code,content);
}
void Sender::OnMessage(talk_base::Message* msg) {}