iOS中開發(fā)簡化view controller的方法
大?。?/span>0.3 MB 人氣: 2017-09-25 需要積分:1
view controller通常是一個項目中最龐大的文件,因為它里面經(jīng)常包含了不屬于它的代碼,同時這也使它成為代碼中最難以重用的部分。所以為view controller瘦身,讓其中的代碼復(fù)用性更強,把相關(guān)代碼放到正確的地方顯得尤其重要。
將Data Source和其他協(xié)議分離
為view controller瘦身最有效的方法就是把UITableViewDataSource中的代碼移動到相關(guān)的類中,具體的方法可以參閱《iOS應(yīng)用開發(fā) 簡明TableView》中的相關(guān)實現(xiàn)。
而更進一步,不只是TableView,這個方法可以擴展到其他的協(xié)議上,比如UICollectionViewDataSource。如果在開發(fā)中選擇使用UICollectionView代替UITableView時,這個方法可以讓你幾乎不用修改viewController中的任何東西,甚至可以讓Data Source同時支持兩個協(xié)議,給予了極大的便利性。
將弱業(yè)務(wù)邏輯移到Model中
首先是代碼,以下的代碼是幫助用戶查找優(yōu)先事項的列表:
-(void)loadPriorities
{
NSDate *now = [NSDate date];
NSString *formatString = @“startDate 《= %@ AND endDate 》= %@”;
NSPredicate *predicate = [NSPredicate predicateWithFormat:formatString, now, now];
NSSet *priorities = [self.user.priorities filteredSetUsingPredicate:predicate];
self.priorities = [priorities allObjects];
}
然而,如果把這些代碼移動到User類中會讓它變得更加明晰,這時ViewController.m中會是:
-(void)loadPriorities
{
self.priorities = [self.user currentPriorities];
}
而User + Extensions.m中則是:
-(NSArray *)currentPriorities
{
NSDate *now = [NSDate date];
NSString *formatString = @“startDate 《= %@ AND endDate 》= %@”;
NSPredicate *predicate = [NSPredicate predicateWithFormat:formatString, now, now];
return [[self.priorities filteredSetUsingPredicate:predicate] allObjects];
}
將這些代碼移動的根本原因是因為ViewController.m是大部分業(yè)務(wù)邏輯的載體,本身代碼的復(fù)雜度已經(jīng)很高,所以這類跟業(yè)務(wù)關(guān)聯(lián)不大的代碼比如日期轉(zhuǎn)換、圖像裁剪、設(shè)定過濾器等的操作可以分離到各自的類中完成,一方面為viewController減負,另一方面也能增進代碼的復(fù)用。
關(guān)于這個標題的翻譯我斟酌了比較久的時間,因為在原文中是“Move Domain Logic into the Model”,意為“把領(lǐng)域邏輯移到Model中”。對于“領(lǐng)域邏輯”一詞我進行過考究,大致意思為“穩(wěn)定的、不會改變的邏輯關(guān)系”,同時在原文中也是使用了NSPredicate作為例子引用,而我認為其例子中的代碼也是與業(yè)務(wù)相關(guān)的,只不過關(guān)聯(lián)性不大,而且不會輕易改動,所以使用了“弱業(yè)務(wù)邏輯”一詞代替了“領(lǐng)域邏輯”一詞。
把數(shù)據(jù)處理的邏輯移到服務(wù)層
一些代碼可能沒辦法很有效的移動到model中,然而這些代碼卻和model中的代碼有清晰的關(guān)聯(lián),對于這種問題,可以使用Store。比如在下面的代碼中,viewController需要完成從一個文件中獲取一些數(shù)據(jù),并對其進行操作:
-(void)readArchive
{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *archiveURL = [bundle URLForResource:@“photodata” withExtension:@“bin”];
NSDate *data = [NSData dataWithContentsOfURL:archiveURL options:0 error:NULL];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
_users = [unarchiver decodeObjectOfClass:[NSArray class] forKey:@“users”];
_photos = [unarchiver decodeObjectOfClass:[NSArray class] forKey:@“photos”];
[unarchiver finishDecoding];
}
事實上,view controller不需要清楚怎么實現(xiàn)這些東西,而應(yīng)該將這些處理交給一個store object來完成。
通過對代碼進行分離,能夠增進代碼復(fù)用、對代碼進行單元測試、保持view controller整潔等。同時能夠讓view controller更多關(guān)注于業(yè)務(wù)本身的內(nèi)容,把數(shù)據(jù)的讀取 、緩存、新建等操作交給服務(wù)層來處理。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
iOS中開發(fā)簡化view controller的方法下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問題? 377
- LabVIEW中PID控制的的高級功能 60
- LabVIEW子VI設(shè)計—多態(tài)VI與自適應(yīng)VI 28
- 森薩塔科技推出下一代盲點監(jiān)測雷達PreView Sentry 79 153
- Magma推出擴展導(dǎo)航范圍的新款軟件BoardView 4
- 聊聊車輛仿真軟件之DYNA4——Overview 107
- LabVIEW批量讀寫三菱PLC數(shù)據(jù)如何實現(xiàn)呢? 247
- Python環(huán)境搭建和LabVIEW中的調(diào)用 172
- 華為全新鴻蒙蓄勢待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋果手機系統(tǒng)iOS 17遭用戶質(zhì)疑 731