iOS using VIPER with UITableView -


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