i have view controller contains table view, want ask should put table view data source , delegate, should external object or can write in view controller if viper pattern.
normally using pattern this:
in viewdidload request flow presenter self.presenter.showsongs()
presenter contains interactor , in showsongs method request data interactor like: self.interactor.loadsongs()
when songs ready passing view controller use presenter 1 more time determine how data should display in view controller. question should datasource of table view?
first of view shouldn't ask data presenter - it's violation of viper architecture.
the view passive. waits presenter give content display; never asks presenter data.
as question: it's better keep current view state in presenter, including data. because it's providing communications between viper parts based on state.
but in other way presenter shouldn't know uikit, uitableviewdatasource , uitableviewdelegate should part of view layer.
to keep viewcontroller in shape , in 'solid' way, it's better keep datasource , delegate in separate files. these parts still should know presenter ask data. prefer in extension of viewcontroller
all module should that:
view
viewcontroller.h
extern nsstring * const tableviewcellidentifier; @interface viewcontroller @end
viewcontroller.m
nsstring * const tableviewcellidentifier = @"cellidentifier"; @implemntation viewcontroller - (void)viewdidload { [super viewdidload]; [self.presenter setupview]; } - (void)refreshsongs { [self.tableview reloaddata]; } @end
viewcontroller+tableviewdatasource.h
@interface viewcontroller (tableviewdatasource) <uitableviewdatasource> @end
viewcontroller+tableviewdatasource.m
@implementation itemslistviewcontroller (tableviewdatasource) - (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section { return [self.presenter songscount]; } - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath { uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier forindexpath:indexpath]; song *song = [self.presenter songatindex:[indexpath.row]]; // configure cell return cell; } @end
viewcontroller+tableviewdelegate.h
@interface viewcontroller (tableviewdelegate) <uitableviewdelegate> @end
viewcontroller+tableviewdelegate.m
@implementation itemslistviewcontroller (tableviewdelegate) - (void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath { song *song = [self.presenter songatindex:[indexpath.row]]; [self.presenter didselectitematindex:indexpath.row]; } @end
presenter
presenter.m
@interface presenter() @property(nonatomic,strong)nsarray *songs; @end @implementation presenter - (void)setupview { [self.interactor getsongs]; } - (nsuinteger)songscount { return [self.songs count]; } - (song *)songatindex:(nsinteger)index { return self.songs[index]; } - (void)didloadsongs:(nsarray *)songs { self.songs = songs; [self.userinterface refreshsongs]; } @end
interactor
interactor.m
@implementation presenter - (void)getsongs { [self.service getsongswithcompletionhandler:^(nsarray *songs) { [self.presenter didloadsongs:songs]; }]; } @end
Comments
Post a Comment