如果您創建一個用於與BLE通信的大型系統(其他人),則BLEManager
不應該是單身人士。這需要能夠處理所有藍牙通信的對象(我相信它已經做到了),並通過委派報告相關數據。
你現在需要的是這個對象的接口,在你的情況下,它最好是一個單例。這個類應該有一個最小化的接口來管理這些數據,並且不應該公開BLEManager
。這意味着創建所有的方法,例如從使用角度來看有意義的BLEManager
的初始化。在某些情況下,將複製BLEManager
中已經完成的界面部分,而某些方法很可能只是將消息轉發給管理員。
這個接口類在開始時可能看起來有點無用,但最終它會拯救你的生命。你應該在這個類中放入所有其他可能的附件,例如本地數據庫管理器,API管理器,分析,嘲笑......
因此,對於您的特定情況下,它會顯得你的任務列表是:
- 創建一個
BLEManager
類,這是能夠通過藍牙通信。
- 創建一個數據管理器類,這將能夠處理,處理和可能存儲從所需輸入的數據,諸如
BLEManager
- 創建接口單,它包括所需的作爲
BLEManager
和數據核心這樣的所有附件經理。單身人士應該提供一個公共的界面,從使用的角度來看是有意義的,包括委託系統或通知系統。
接口應該再是這個樣子:
頭
@protocol CoreManagerDelegate
- (void)coreManager:(CoreManager *)sender updatedData:(id)data;
@optional
- (void)coreManager:(CoreManager *)sender encounteredIssue:(NSError *)issue;
- (void)coreManager:(CoreManager *)sender changedConnectionState:(BluetoothConnectionState)isConnected; // BluetoothConnectionStateUnkown, BluetoothConnectionStateDisabled, BluetoothConnectionStateNotPaired, BluetoothConnectionStateConnected...
@end
@interface CoreManager : Singleton
@property (weak) id<CoreManagerDelegate> delegate;
- (void)initialize;
- (void)fetchBluetoothData;
- (id)getCurrentData;
@end
來源
@interface CoreManager()
@property BLEManager *bluetoothManager;
@property DataManager *dataManager;
@end
@implementation CoreManager
#pragma mark - Bluetooth manager attachment
- (void)fetchBluetoothData {
[self.bluetoothManager fetchSomeData];
}
#pragma mark Delegate
- (void)BLEManager:(BLEManager *)sender receivedNewData:(id)data {
// do data validation, log if needed, report...
[self.dataManager insertNewData:data];
}
- (void)BLEManager:(BLEManager *)sender encounteredIssue:(NSError *)issue {
// modify and evaluate the error if needed
if([self.delegate respondsToSelector:@selector(coreManager:encounteredIssue:)]) {
[self.delegate coreManager:self encounteredIssue:issue];
}
else {
// log error ?
}
// send the error to a remote service
}
#pragma mark - Data manager attachment
- (id)getCurrentData {
return [self.dataManager currentData];
}
#pragma mark Delegate
- (void)dataManager:(DataManager *)sender updatedData:(id)processedData {
[self.delegate coreManager:self updatedData:processedData];
}
- (void)dataManager:(BLEManager *)sender encounteredIssue:(NSError *)issue {
// modify and evaluate the error if needed
if([self.delegate respondsToSelector:@selector(coreManager:encounteredIssue:)]) {
[self.delegate coreManager:self encounteredIssue:issue];
}
else {
// log error ?
}
// send the error to a remote service
}
@end
現在,這將保持非常CLE一個敏捷的代碼。它將防止任何不必要的階級或文件通貨膨脹。它爲測試和嘲笑數據提供了一個非常好的機會。從使用的角度來看,添加附加功能將是透明的:例如,實現核心數據不會在項目的用戶界面部分產生變化。
如果可能,id
類型應該替換爲具體的自定義對象。即使錯誤和日誌也是最好的定製,所以你可以在應用程序中輕鬆地跟蹤它們,隨意啓用和禁用它們。
注意:如果您認爲將藍牙管理器轉換爲普通對象而不是單例服務器的變化太大,您可能仍然保留它爲單例,並簡單地覆蓋getter以返回共享實例。
我相信還有很多其他的良好做法,但這是我主要使用的一個,並且已被證明是迄今爲止最好的。我希望它能幫助你。
每個BLE設備使用一個模型對象。這樣它不是一個單身人士。 (但是,如果你只連接到一個設備,那麼你最終只能得到一個。) – hotpaw2