Цель c наследование и сеттер

Задача C вопрос:

У меня есть суперкласс ViewController и суперкласс контроллера данных. Контроллер данных имеет делегацию, чтобы сообщить ViewController, когда он обновился. Кажется, что все работает, но после внесения некоторой записи, кажется, что метод делегата вызывается дважды каждый раз. Я думаю, что на самом деле у меня может быть два экземпляра каждого SubDataController. Должно быть, я что-то не так понял. Кто-нибудь может увидеть, что я делаю не так?

У меня есть отдельные экраны приложения с интенсивным использованием данных. Я настроил его так, что есть суперкласс UIViewController, который все наследуют от:

DmsProgressBaseViewController.h

@class DmsProgressDataController;

@interface DmsProgressBaseViewController : UIViewController

@property(readonly,assign,nonatomic)DmsProgressDataController *dataController;
//index, so we be identified in container
@property(assign,nonatomic)NSInteger index;

@end

DmsProgressBaseViewController.m

@implementation DmsProgressBaseViewController

@synthesize dataController=_dataController;


- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressDataController alloc]init];
    }
    return _dataController;
}

.....

@end

Как вы можете видеть, каждое представление имеет контроллер данных, который загружает данные через службу отдыха и импортирует их в основные данные. Он также унаследован от: DmsProgressDataController.h

@class AFHTTPRequestOperation;
@class DmsProgressDataController;

@protocol DmsProgressDataControllerDelegate

-(void)dataLoadedSuccessfully;

@end


@interface DmsProgressDataController : NSObject

@property(nonatomic,assign)id delegate;
@property(nonatomic, strong)NSString *resourceUrl;
-(void)loadDataFromRest;
-(void)loadDataFromRest:(NSString*)resourceUrl;
-(void)handleRestSuccess:(id)jsonResponse;
-(void)handleRestError:(NSError*)error forOperation:(AFHTTPRequestOperation*)operation;

//delegate method
-(void)notifyDataLoadedSuccessfully;

@end

DmsProgressDataController.m @implementation DmsProgressDataController

- (id)init
{
    self = [super init];
    if (self) {

    }
    return self;
}

-(void)loadDataFromRest
{
    NSLog(@"loading %@",self.resourceUrl);
    if(self.resourceUrl!=nil){
        [self loadDataFromRest:self.resourceUrl];
    }
}
....

#pragma mark - delegate methods
-(void)notifyDataLoadedSuccessfully
{
    if(self.delegate!=nil){
        [self.delegate dataLoadedSuccessfully];
    }
}
@end

Так что это супер классы.....

Примером подкласса является: DmsProgressOveragesViewController.h @class DmsProgressOveragesDataController;

@interface DmsProgressOverallViewController : DmsProgressBaseViewController

@property(readonly,strong,nonatomic)DmsProgressOverallDataController *dataController;

@end

DmsProgressOverallViewController.m

@interface DmsProgressOverallViewController ()<DmsProgressDataControllerDelegate>

@end

@implementation DmsProgressOverallViewController
@synthesize dataController=_dataController;
- (void)viewDidLoad
{
    [super viewDidLoad];
[self.dataController loadDataFromRest:@"overall"];
    self.dataController.delegate=self;
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressOverallDataController alloc]init];
    }
    return _dataController;
}
#pragma mark - datacontroller delegate method
-(void)dataLoadedSuccessfully
{
    NSLog(@"Overall data loaded successfully");
}

@end

с помощью контроллера данных:

DmsProgressOverallDataController.h

@interface DmsProgressOverallDataController : DmsProgressDataController

@end

DmsProgressOverallDataController.m

@implementation DmsProgressOverallDataController


-(id)init
{
    if(self=[super init]){
        self.resourceUrl=@"progress/totals";
    }

    return self;
}

-(void)handleRestSuccess:(id)jsonResponse
{
    NSString *defaultClg=[jsonResponse objectForKey:@"defaultClg"];
    NSArray *clgs=[jsonResponse objectForKey:@"colleges"];
    for(NSString *clg in clgs){
        College *college =[College MR_createEntity];
        college.collegeName=clg;
        if([defaultClg isEqualToString:clg]){
            college.defaultClg=[NSNumber numberWithBool:YES];
        }
    }

    //DataController delegate method called here
    if(self.delegate!=nil){
        [self.delegate dataLoadedSuccessfully];
    }

}

@end

Я надеюсь, что это дает достаточно информации. Еще раз спасибо за вашу помощь!

1 ответ

У вас есть имя переменной экземпляра и имя свойства в SubViewController, которые также присутствуют в суперклассе SuperViewController. Вы синтезируете имя свойства как в суперклассе, так и в классе. Я подозреваю, что происходит то, что _dataController в SubViewClass является унаследованным _dataController от SuperViewController. Вы не даете достаточно кода, чтобы увидеть, как используется dataController, но если бы у вас были разные имена ivar и свойств (a), это было бы менее запутанным для чтения, и (b) это могло бы решить проблему двойного вызова. Попробуйте и посмотрите!

Другие вопросы по тегам