在ios開發中,難免會用到helper的思想。這篇就簡單講解下關於helper的簡單實用方法。
假設我們要做一個這樣的界面:
會議分為四種情況:
- 未召開
- 正在召開
- 已結束
- 已取消
再看看邏輯關系:

編程聯想:
當我們要開發某一種功能的時候,有的同學可能一上來就寫代碼,由於有一定的經驗,可能很快就實現了功能,但遇到業務復雜的功能,這么做就很容易寫出雜亂的代碼。我的習慣是,不妨先畫出邏輯圖,如果能夠事先確定一些大概的方法,就更好了,我們的目的就是使用精簡的代碼完成功能。
我們這個界面主要依賴Meeting模型,模型中我們用到幾個關鍵的屬性:
- status 會議的狀態
- join 是否加入會議 0:未加入 1:不出席 2:已出席
- meetingtype 是否是視頻會議
我們為了把邏輯封裝到一個文件中,我們創建了QKYMeetingDetailHelper這個類。
我們需要通過一個方法,參數為Meeting模型,然后轉換成我們想要的結果。
+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent *)meeting
按照這個功能的設計,最終會有5種不同的界面呈現出來,也就是說會有5種結果。按照結果,我們設計了一個枚舉MeetingDetailStatus
/*!
@discussion 按照業務的要求,會議詳情目前會有5種不同的顯示結果
* 1. 什么都不顯示:會議已取消 || 已結束 || 正在召開或未召開的前提下是主持人且會議不是視頻會議
* 2. 顯示加入會議:未召開或正在召開 且不是主持人 join == 2
* 3. 顯示發起會議:未召開或正在召開 且是是視頻會議
* 4. 顯示確認出席和不能出席:未召開或正在召開,且不是主持人 join == 0
* 5. 顯示不出席:未召開或正在召開,且不是主持人 join == 1
*/
typedef NS_ENUM(NSUInteger, MeetingDetailStatus) {
MeetingDetailStatusNone,
MeetingDetailStatusJoin,
MeetingDetailStatusHold, //發起
MeetingDetailStatusIsJoin, //是否參加
MeetingDetailStatusRefuse, //不出席
};
ps:在編程中,當我們遇到一個事物可能有幾種不同的情況的時候,我們就應考慮使用枚舉了,在swift中枚舉更加強大。
@interface QKYMeetingDetailHelper : NSObject
/**
* 根據會議模型解析出我們需要現在的轉態
*
* @param meeting 會議模型
*
* @return 會議詳情的狀態
*/
+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent * _Nonnull)meeting;
@end
在來看看實現方法:
+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent *)meeting {
NSParameterAssert(meeting);
//根據Meeting模型中的status判斷會議狀態
// 0:未召開, 1:正在召開, 2:已結束, 3:已取消
// 已結束或者已取消
if (meeting.status.integerValue == 2 || meeting.status.integerValue == 3) {
return MeetingDetailStatusNone;
}else {
// 是否是主持人
BOOL isHost = meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
// 是否是是視頻會議
BOOL isVideo = meeting.meetingRoom.meetingtype.integerValue > 0;
// 是主持人但不是視頻會議
if (isHost && !isVideo) return MeetingDetailStatusNone;
// 是主持人且是視頻會議
if (isHost && isVideo) return MeetingDetailStatusHold;
// 不是主持人且未選擇是否出席
if (!isHost && meeting.join.integerValue == 0) return MeetingDetailStatusIsJoin;
// 不是主持人且已選擇不出席
if (!isHost && meeting.join.integerValue == 1) return MeetingDetailStatusRefuse;
// 不是主持人且已選擇出席
if (!isHost && meeting.join.integerValue == 2) return MeetingDetailStatusJoin;
}
return MeetingDetailStatusNone;
}
其實,這個邏輯算是比較簡單的了,遇到復雜點的,或者方法重復調用的時候,我們可以這樣寫:
static BOOL getIsHost(QKYMeetingContent *meeting) {
return meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
}
我們不建議寫成這樣:
- (BOOL)getIsHost:(QKYMeetingContent *)meeting {
return meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
}
前邊的寫法更加像是c的寫法。不但限制了訪問的權限,而且表示這是一個私有方法,和其他的點擊事件的方法區別開來。如果方法的調用頻率很大,那么可以考慮使用內聯函數來提高性能。
好了,使用方法就不介紹了,其實,怎么實現功能不重要,重要的是如何維護功能。helper就像一個管理者一樣,負責他自己的那部分工作,如果功能需要改變,我們改變helper就可以了。
