该【猿题库IOS客户端架构设计 】是由【住儿】上传分享,文档一共【35】页,该文档可以免费在线阅读,需要了解更多关于【猿题库IOS客户端架构设计 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
ሧ᷌ପiOSਮಁᒒຝᦡᦇ
ӞᐿचԭMVCMVVMදᬰጱຝ
᠗ล᰷iOSࢫᴚᨮᨱՈ:.
Model-View-Controller:.
MVCսᅩ
ฃԟ
ฃݎ
᭗አ౮ᆧ:.
MVCᗌᅩ
MassiveViewController:.
Model-View-ViewModel:.
owns
owns
ModelViewControllerView
updates
updates:.
owns
ModelViewControllerView
updates:.
ownsowns
ModelViewModelViewControllerView
updatesupdates:.
MVVMսᅩ
ٺԧVCጱᨮ
ๅݢၥᦶ
୩य़ጱᕬਧګ:.
MVVMᗌᅩ
ຄṛጱԟ౮ݎ౮
හഝᕬਧֵBugๅᵙ᧣ᭇ
ViewModelጱᘳᨱՖᆐஉ᯿:.
ࣁӷᐿຝӾᤍᘒԾኞጱຝ:.
MVVMwithoutBINDING
withDATACONTROLLER:.
ModelViewControllerView:.
ViewControllerView:.
ᤰᯈ
ྯӞӻV᮷ํӞӻଫጱVM҅V
ViewControllerViewModel
ጱහഝᐏୗ᮷ኧٌਧګ
ӧګᥡګਧᕬݻف҅
ਧګ
ᘒฎ᭗ᬦփᕹጱդቘࢧ᧣᭗Ꭳ
UIԪկ
ਖ਼UIԪկփᕳक़ኴ
View
VCݝᨮᨱਖ਼VMᤰᯈᕳV҅ളݑUI
Ԫկ:.
অ॒
•
Viewݢզਠقᥴᘠ҅ݝᵱᥝᏟਧঅViewModelࢧ᧣ളݗܨݢ
•
ViewController੶ݢզੱݢᚆጱViewጱٍ֛ᤒሿԻ᭲҅
ਖ਼ᬯ᮱ړᘳᨱᕳԧViewModel҅ٺԧViewControllerጱᨮ
•
ֵአփᕹጱࢧ᧣ګ҅ԟ౮֗҅හഝԪկၞفၞڊฃ
ᥡݢഴ҅ᴳ֗ᖌಷ᧣ᦶ౮:.
ModelViewControllerViewModel
View:.
ਖ਼॒ቘහഝ឴ݐහഝጱᘳ
ᨱփᕹMVVMጱVMӾು
ᐶڊ҅౮ԅDC
᧗/Ԫկ
DataControllerViewController
VC᧗හഝਖ਼ӞԶහഝ
ےૡݸጱහഝץදጱԪկҁݢզฎUIԪկ
ݎ҂փ᭓ᕳDC
ᗑᕶ/හഝପ
DCളතکVCጱ᧗ݸ҅
ݐ឴Mݻහഝๅෛහഝ҅
ଚਖ਼ےૡݸጱහഝᬬࢧ
Model
DCᬮᨮᨱᗑᕶ੶೮ԋ੶
ጱ᭦ᬋ:.
অ॒
•
عԧփᕹMVVMຝVM੶ํݢᚆݒᛎᙠጱఘ٭҅ๅႴศጱཛྷࣘ
ᘳᨱ
•ӱۓ᭦ᬋᥴᘠ҅හഝጱےૡ॒ቘ᮷නࣁDataControllerӾ҅View
Controllerӧٚىஞහഝই֜឴҅ই॒֜ቘ҅DataControllerӧٚᵱ
ᥝىஞኴᶎই֜ᐏ҅ই֜Ի
•DataControllerኧԭኴᶎ෫ى҅ಅզݢզํๅঅጱݢၥᦶݢ॔አ:.
᧗/Ԫկ
ᤰᯈ
DataControllerViewControllerViewModel
ےૡݸጱහഝ
ᗑᕶ/හഝପਧګ
UIԪկ
ModelView:.
“TalkisCheap,ShowmetheCode.”
–LinusTorvalds:.
ெԍ؉Ҙ
ሧ᷌ପጱԆᶭᶎ:.
ViewController
•ྯӞӻViewControllerտํӞӻଫጱDataController
•ኴᶎೆړ౮پӻܔᇿጱViewғBannerView҅ActivityView҅SubjectView
***@interfaceAPEHomePracticeViewController()<APEHomePracticeSubjectsViewDelegate,
APEBannerCycleImageViewDelegate,APECoverAdViewDelegate,APEHomePracticeActivityViewDelegate>
***@property(nonatomic,strong,nullable)UIScrollView*contentView;
***@property(nonatomic,strong,nullable)APEHomePracticeBannerView*bannerView;
***@property(nonatomic,strong,nullable)APEHomePracticeActivityView*activityView;
***@property(nonatomic,strong,nullable)APEHomePracticeSubjectsView*subjectsView;
***@property(nonatomic,strong,nullable)APEHomePracticeDataController*dataController;
***@end:.
ViewController
•ࣁviewDidLoadጱײ҅ڡত۸ݱӻView҅ଚᦡᗝঅੴ
-(void)setupContentView{
=[[UIScrollViewalloc]init];
[:];
=[[APEHomePracticeBannerViewalloc]init];
=self;
=[[APEHomePracticeActivityViewalloc]init];
=self;
=[[APEHomePracticeSubjectsViewalloc]init];
=self;
[:];
[:];
[:];
//LayoutViews
...
}:.
զSubjectViewԅֺ
•ݻDataController᧗Subjectsጱහഝ
•᧗ਠ౮ݸ҅አ឴ጱහഝኞ౮ViewModel҅ଚਖ਼ٌᤰᯈᕳSubjectView
-(void)fetchSubjectData{
[:^(NSError*error){
if(error==nil){
[selfrenderSubjectView];
}
}];
}
-(void)renderSubjectView{
APEHomePracticeSubjectsViewModel*viewModel=
[APEHomePracticeSubjectsViewModelviewModelWithSubjects:];
[:viewModel];
}:.
Subjectፘىහഝᕮ
•APESubjectғᑀ҅۱ތidnameᒵં
•APEUserSubjectғአಁᑀמ௳҅۱ތአಁฎވސӻᑀᒵં
***@interfaceAPESubject:MTLModel<MTLJSONSerializing>
***@property(nonatomic,strong,nullable)NSNumber*id;
***@property(nonatomic,strong,nullable)NSString*name;
***@end
***@interfaceAPEUserSubject:MTLModel<MTLJSONSerializing>
***@property(nonatomic,strong,nullable)NSNumber*id;
***@property(nonatomic,strong,nullable)NSNumber*updatedTime;
///OnorOff
***@property(nonatomic)APEUserSubjectStatusstatus;
***@end:.
DataController
•ྯӞӻViewControllerํӞӻଫጱDataController҅۱ތԧᬯӻᶭᶎӤಅํහ
ഝፘى᭦ᬋ҅౯ժᑍٌԅViewRelatedDataController
•ԅԧดᐏSubjectViewᵱᥝӞӻአಁސጱᑀፓڜᤒ҅ਧԎԅopenSubjects
•ਧԎӞӻളݗ᧗ᬯӻහഝ
***@interfaceAPEHomePracticeDataController:APEBaseDataController
///Subjectsthatareopenwithcurrentphase.
***@property(nonatomic,strong,nonnull,readonly)NSArray<APESubject*>*openSubjects;
///Requestsubjectdataandcallcallbackwhenfinished.
///
///***@paramcallbackCompletioncallbackblock.
-(void)requestSubjectDataWithCallback:(nonnullAPECompletionCallback)callback;
***@end:.
•DataControllerݢզ॔አๅੜጱDataController҅᭗ଉݝ۱ތᕍᔙጱModelፘى᭦ᬋֺ҅
ইᗑᕶ᧗҅හഝପ᧗҅ฎचጱහഝےૡ̶౯ժᑍٌԅModelRelatedData
Controller
•ᬯᔄDataControllerᕪଉ׀ྋԻጱහഝ̶ֺইSubjectDataController҅׀ԧಅํጱ
allSubjectsҁAPESubjectᔄ҂አಁސጱuserSubjectsҁAPEUserSubjectᔄ҂̶ਖ਼ᬯԶྋ
Իහഝےૡ౮ኴᶎ๋ᕣᵱᥝጱහഝopenSubjectsҁAPESubjectᔄ҂
***@interfaceAPEHomePracticeDataController()
***@property(nonatomic,strong,nonnull)APESubjectDataController*subjectDataController;
***@end
***@implementationAPEHomePracticeDataController
-(void)requestSubjectDataWithCallback:(nonnullAPECompletionCallback)callback{
APEDataCallbackdataCallback=^(NSError*error,iddata){
callback(error);
};
[:dataCallback];
[:dataCallback];
}
***@end
-(nonnullNSArray<APESubject*>*)openSubjects{
?:@[];
}:.
ViewModel
•ྯӻView᮷տํӞӻଫጱViewModel
•ViewModel۱ތԧᐏᬯӻViewಅᵱᥝጱಅํහഝ
•አૡܯොဩىᥝᵱٚӧဩොӻᬯ҅ledoMViewୌڠஞփ᭓ጱฎಅํጱ
SubjectsᬮฎአಁސጱSubjects
***@interfaceAPEHomePracticeSubjectsViewModel:NSObject
***@property(nonatomic,strong,nonnull)NSArray<APEHomePracticeSubjectsCollectionCellViewModel*>
*cellViewModels;
***@property(nonatomic,strong,nonnull)UIColor*backgroundColor;
+(nonnullAPEHomePracticeSubjectsViewModel*)viewModelWithSubjects:(nonnullNSArray<APESubject*>
*)subjects;
***@end:.
ViewModel
•ViewModelݢզ۱ތৼViewModel҅੪؟ViewݢզํSubview
•SubjectViewٖ᮱ኧUICollectionViewਫሿ҅ਖ਼CellԞଫጱᦡᦇӞӻView
Model
***@interfaceAPEHomePracticeSubjectsCollectionCellViewModel:NSObject
***@property(nonatomic,strong,nonnull)UIImage*image;
***@property(nonatomic,strong,nonnull)UIImage*highlightedImage;
***@property(nonatomic,strong,nonnull)NSString*title;
***@property(nonatomic,strong,nonnull)UIColor*titleColor;
***@property(nonatomic,strong,nonnull)UIColor*backgroundColor;
+(nonnullAPEHomePracticeSubjectsCollectionCellViewModel*)viewModelWithSubject:(nonnull
APESubject*)subject;
+(nonnullAPEHomePracticeSubjectsCollectionCellViewModel*)viewModelForMore;
***@end:.
View
•ਧԎঅᤰᯈViewModelጱളݗ
•ਧԎঅUIࢧ᧣Ԫկ
***@protocolAPEHomePracticeSubjectsViewDelegate<NSObject>
-(void)homePracticeSubjectsView:(nonnullAPEHomePracticeSubjectsView*)subjectView
didPressItemAtIndex:(NSInteger)index;
***@end
***@interfaceAPEHomePracticeSubjectsView:UIView
***@property(nonatomic,strong,nullable,readonly)APEHomePracticeSubjectsViewModel*viewModel;
***@property(nonatomic,weak,nullable)id<APEHomePracticeSubjectsViewDelegate>delegate;
-(void)bindDataWithViewModel:(nonnullAPEHomePracticeSubjectsViewModel*)viewModel;
***@end:.
View
•ֵአViewModelጱහഝວኴᶎ
•SubviewԞݢզֵአViewModel
-(void)bindDataWithViewModel:(nonnullAPEHomePracticeSubjectsViewModel*)viewModel{
=viewModel;
=;
[];
[selfsetNeedsUpdateConstraints];
}
-(UICollectionViewCell*)collectionView:(UICollectionView*)collectionViewcellForItemAtIndexPath:
(NSIndexPath*)indexPath{
APEHomePracticeSubjectsCollectionViewCell*cell=[collectionView
dequeueReusableCellWithReuseIdentifier:@"Cell"forIndexPath:indexPath];
if(0<=&&<){
APEHomePracticeSubjectsCollectionCellViewModel*vm=
[];
[cellbindDataWithViewModel:vm];
}
returncell;
}:.
ViewController
***@interfaceAPEHomePracticeViewController()<APEHomePracticeSubjectsViewDelegate,
APEBannerCycleImageViewDelegate,APECoverAdViewDelegate,APEHomePracticeActivityViewDelegate>
***@property(nonatomic,strong,nullable)UIScrollView*contentView;
***@property(nonatomic,strong,nullable)APEHomePracticeBannerView*bannerView;
***@property(nonatomic,strong,nullable)APEHomePracticeActivityView*activityView;
***@property(nonatomic,strong,nullable)APEHomePracticeSubjectsView*subjectsView;
***@property(nonatomic,strong,nullable)APEHomePracticeDataController*dataController;
***@end
-(void)fetchSubjectData{
[:^(NSError*error){
if(error==nil){
[selfrenderSubjectView];
}
}];
}
-(void)renderSubjectView{
APEHomePracticeSubjectsViewModel*viewModel=
[APEHomePracticeSubjectsViewModelviewModelWithSubjects:];
[:viewModel];
}:.
ᕮ
੶ེႴศ҅ᘳᨱกᏟ҅ᘠݳଶ֗҅॔አṛ҅ၥᦶṛ
֗ԟ౮҅֗ݎ౮
ṛਫෞ҅෫ᵱෆ֛᯿:.
Q&A
THANKS
ࢵݪلᙙරᕚࣁጱհํ๋ٖሧ᷌ପᬮࣁ೮ᖅՈӾ
Webڹᒒ̵๐ۓᒒ̵iOS̵Android̵Windows̵ᓒဩᎸᑪ̵ᶪᥤ̵᷇ᬩᖌᒵ
᠗ล᰷
猿题库IOS客户端架构设计 来自淘豆网m.daumloan.com转载请标明出处.