如何解决无法从库中触发回调方法
我有一种方法,应该在连接BLE设备后立即调用。但由于某种原因,这没有发生。 有多个视图控制器首先都在其中完成工作,但是没有调用最后一个应更新标签的视图控制器,这称为realDataCallBackWithData。
这是 viewController.m 中未被调用的代码:
#import "ViewController.h"
#import "CRPC_300SDK.h"
#import "CRBlueToothManager.h"
#import "CRHeartLiveView.h"
#import "DataObject.h"
#import "IntervalGraph.h"
#import <VTO2Lib/VTO2Lib.h>
#import "VTBLEUtils.h"
#import "VTConnectViewController.h"
@interface ViewController ()<CRPC_300SDKDelegate,CRBlueToothManagerDelegate,VTO2CommunicateDelegate>
- (void)viewDidLoad
{
[super viewDidLoad];
[VTO2Communicate sharedInstance].delegate = self;
}
#pragma mark -
#pragma mark VTO2Parser Update
//This is the method which when called should activate the realDataCallBackWithData method below.
- (void)readRealtimeData{
if (self.deviceCom.sensorConnected == NO){
NSLog(@"readRealtimeData NOT activated,sensor state %d",self.deviceCom.sensorConnected);
}else if (self.deviceCom.sensorConnected == YES){
NSLog (@"readRealtimeData activated");
[[VTO2Communicate sharedInstance] beginGetRealData];
}
}
// This is the method not being called:
-(void)realDataCallBackWithData:(NSData *)realData
{
if (realData == nil){
NSLog(@"error");
return;
}
VTRealObject *rObj = [VTO2Parser parseO2RealObjectWithData:realData];
u_char hr = rObj.hr;
_spo2Label.text = [NSString stringWithFormat:@"%d",hr];
NSLog(@"O2Ring HR = %hhu",hr);
}
供参考,这里是 VTO2Communicate.h :
#import <Foundation/Foundation.h>
#import <CoreBluetooth/CoreBluetooth.h>
#import "VTO2Def.h"
@class VTFileToRead;
NS_ASSUME_NONNULL_BEGIN
@protocol VTO2CommunicateDelegate <NSObject>
@optional
- (void)serviceDeployed:(BOOL)completed;
/// @brief Common command send to peripheral,callback
/// @param cmdType command for VTCmdTypeSyncParam/VTCmdTypeSetFactory
/// @param result view the enum VTProCommonResult
- (void)commonResponse:(VTCmdType)cmdType andResult:(VTCommonResult)result;
/// @brief Send the current progress of reading
/// @param progress progress value
- (void)postCurrentReadProgress:(double)progress;
/// @brief Read file complete
/// @param fileData view model --- VTFileToRead
- (void)readCompleteWithData:(VTFileToRead *)fileData;
/// @brief get information complete . if infoData == nil,an error occurred
/// @param infoData information data nullable
- (void)getInfoWithResultData:(NSData * _Nullable)infoData;
/// @brief use `parseO2RealObjectWithData` to parse realData. if realData == nil,an error occurred.
/// @param realData real data
- (void)realDataCallBackWithData:(NSData * _Nullable)realData;
/// @brief use `` to parse realPPG. if realPPG == nil,an error occurred.
/// @param realPPG real PPG data
- (void)realPPGCallBackWithData:(NSData * _Nullable)realPPG;
/// @brief read current peripheral's rssi
/// @param RSSI rssi
- (void)updatePeripheralRSSI:(NSNumber *)RSSI;
@end
@interface VTO2Communicate : NSObject
/// @brief This peripheral is currently connected. Need to be set after connection
@property (nonatomic,strong) CBPeripheral *peripheral;
/// @brief current file been read or written
@property (nonatomic,strong) VTFileToRead *curReadFile;
/// @brief time out ms
@property (nonatomic,assign) u_int timeout;
@property (nonatomic,assign) id<VTO2CommunicateDelegate> _Nullable delegate;
+ (VTO2Communicate *)sharedInstance;
- (void)readRSSI;
/// @brief Get information of peripheral. callback `getInfoWithResultData:`
- (void)beginGetInfo;
/// @brief Get real-time data. callback `realDataCallBackWithData:`
- (void)beginGetRealData;
/// @brief Restore factory. callback `commonResponse: andResult:`
- (void)beginFactory;
/// @brief get PPG data.
- (void)beginGetRealPPG;
/// @brief set params . all type view struct `VTParamType` . callback `commonResponse: andResult:`
/// @param paramType param type
/// @param paramValue param content/value
- (void)beginToParamType:(VTParamType)paramType content:(NSString *)paramValue;
/// @brief Download file from peripheral. callback `readCompleteWithData:` & `postCurrentReadProgress:`
/// @param fileName file's name
- (void)beginReadFileWithFileName:(NSString *)fileName;
@end
/// @brief this is a class to describe the completeed current loading or writing file
@interface VTFileToRead : NSObject
@property (nonatomic,assign) NSString *fileName;
@property (nonatomic,assign) u_int fileSize;
@property (nonatomic,assign) u_int totalPkgNum;
@property (nonatomic,assign) u_int curPkgNum;
@property (nonatomic,assign) u_int lastPkgSize;
/// @brief download completed response data .
@property (nonatomic,strong) NSMutableData *fileData;
/// @brief read file result
@property (nonatomic,assign) VTFileLoadResult enLoadResult;
@end
NS_ASSUME_NONNULL_END
和 VTO2Parser.h
#import <Foundation/Foundation.h>
#import "VTO2Info.h"
#import "VTO2Object.h"
#import "VTO2WaveObject.h"
#import "VTRealObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface VTO2Parser : NSObject
/// @brief parse O2 information
/// @param infoData infoData from peripheral
+ (VTO2Info *)parseO2InfoWithData:(NSData * _Nonnull)infoData;
/// @brief parse O2 object
/// @param fileData fileData from peripheral
+ (VTO2Object *)parseO2ObjectWithData:(NSData * _Nonnull)fileData;
/// @brief parse O2 Wave array .
/// @param waveData waveData from VTO2Object
+ (NSArray <VTO2WaveObject *>*)parseO2WaveObjectArrayWithWaveData:(NSData * _Nonnull)waveData;
/// @brief parse O2 Real-time data
/// @param realData realData from peripheral
+ (VTRealObject *)parseO2RealObjectWithData:(NSData *)realData;
/// @brief parse O2 Real PPG data
/// @param realPPG real PPG data from peripheral
+ (NSArray <VTRealPPG *>*)parseO2RealPPGWithData:(NSData *)realPPG;
@end
NS_ASSUME_NONNULL_END
其他所有内容都被调用,并且我已经在日志中确认了这一点,只有viewController.m中的方法没有触发,有人可以告诉我我哪里出错了吗?
解决方法
我发现解决此问题的方法是在外围设备连接后重新声明委托,我通过在readRealTimeData方法中添加以下代码行来做到这一点:
[VTO2Communicate sharedInstance].delegate = self;
这是现在可以使用的方法的外观:
- (void)readRealtimeData{
if (self.deviceCom.sensorConnected == NO){
NSLog(@"readRealtimeData NOT activated,sensor state %d",self.deviceCom.sensorConnected);
}else if (self.deviceCom.sensorConnected == YES){
NSLog (@"readRealtimeData activated");
[VTO2Communicate sharedInstance].delegate = self;
[[VTO2Communicate sharedInstance] beginGetRealData];
}
}
这可以确保在触发回调之前重置代理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。