3

我正在開發一個項目,其中有一個應用程序通過可穿戴外設的BLE接收數據,但我正在努力構建應用程序。目前我有一個單獨的BLEManager類,它不斷在後臺接收數據,然後使用NSNotificationCenter將其發送到活動視圖控制器。這有效,但已變得混亂,似乎不理想,因爲我有多個視圖控制器,每個視圖控制器以相同的方式處理數據,然後以不同的方式顯示它。此外,還有一些與數據處理相關的設置可以在應用程序中更改,並且需要在任何地方都一樣。如果BLEManager將數據發送到中央處理類,然後將處理後的數據發送給活動視圖控制器,那將會很好,但我不確定如何設置它。我應該如何構建我的應用程序來處理傳入的藍牙數據?

我可以將所有處理合併到BLEManager類中,但這樣會變得非常臃腫和不直觀,並且不能很好地繼續前進。如果我創建一個單獨的處理類,那是BLEManager的一個屬性,那麼如果我想要從處理類中的任何變量中獲取或更改任何會令人討厭的變量,就必須通過BLEManager。我可以做一個singleton處理類,它接收來自BLEManager的數據,然後將它發送給活動的VC,但是我看到有人說要避免單例,所以我很猶豫要使用另一個,即使這看起來可能是一個好東西解。

是否有標準或推薦的方式來構建iOS應用程序來處理來自藍牙的傳入數據,然後將其發送到需要的地方?

+0

每個BLE設備使用一個模型對象。這樣它不是一個單身人士。 (但是,如果你只連接到一個設備,那麼你最終只能得到一個。) – hotpaw2

回答

0

我不知道這個標準設計模式,但我已經看到了廣泛使用的Singleton BLEManager。我的理解是,你只需要一個對象處理BLE通道。

爲了防止BLEManager變得過於臃腫,可以使用委託模式和每個需要處理的BLE消息使用不同的協議。這樣,您的BLEManager只是通過處理每種類型的消息的委託來路由消息。

這會給你一個更好的問題分離,讓你的BLEManager不會臃腫。然後,BLEManager將會與消息處理代表中發生的真實工作無關。

+0

好的,這聽起來與我現在正在做的非常相似(除了我使用NSNotificationCentre而不是委派)。我喜歡讓BLEManager在發送消息時發送消息,但我對發生處理的最佳位置感到困惑。例如,如果我使用委託,每個視圖控制器應該是委託還是應該有另一個類從BLEManager接收數據,然後處理它,然後將它發送到活動視圖控制器? – 2157192358723

+0

通常,在視圖控制器中保留任何處理邏輯是一個壞主意,所以最好將此邏輯保存在不同的類中。 –

1

如果您創建一個用於與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以返回共享實例。

我相信還有很多其他的良好做法,但這是我主要使用的一個,並且已被證明是迄今爲止最好的。我希望它能幫助你。

相關問題