Лучший способ передачи данных между nsobject и контроллером представления

У меня есть вспомогательный класс, в котором есть функция, которая делает вызов API, получает некоторые данные и форматы json и возвращает массив. Мой TableViewController пытается получить доступ к этому возвращаемому массиву. Да, как вы и ожидали, мой метод tableviewcontroller viewDidLoad не может получить доступ к объекту массива, возвращаемому моим вспомогательным классом.

@interface MyHelperClass : NSObject

@property (nonatomic,retain)NSArray *myArray;

@end

@implementation MyHelperClass

@synthesize myArray;

- (NSArray *) returnArray{

 // make api calls and return array

  return myArray;

}

@end

@implementation MyTableViewController
{
- (void)viewDidLoad
{
    [super viewDidLoad];

    MyHelperClass *myhelper = [[MyHelperClass alloc]initWithPath:getSpacePath];

    allTopics = (NSArray *)[myhelper returnArray];

    NSLog(@"Load my Array%@",allTopics);
}
}

Мой вопрос: нужно ли мне реализовывать делегата для передачи данных или есть ли другой способ передать данные моему контроллеру представления?

P.S: я не хочу использовать глобальную переменную


person Harish    schedule 15.04.2013    source источник
comment
Пожалуйста, уточните вопрос относительно вызовов sync/async API. Я надеюсь, что они асинхронные, это объясняет, почему myArray равно нулю, и вам действительно нужно продолжать использовать асинхронные вызовы. Помимо шаблона делегата, вы можете использовать API уведомлений или блоки.   -  person A-Live    schedule 15.04.2013
comment
@A-Live Полностью с тобой согласен.   -  person viral    schedule 15.04.2013
comment
Я использую AFNetworking для выполнения остальных вызовов API. myArray не равен нулю, я могу видеть ответ json в своих журналах.   -  person Harish    schedule 15.04.2013
comment
@A-Live, вы случайно не знаете, делает ли AFHttpClient запросы асинхронно? Я только что распечатал журнал, и то, что вы сказали, может быть правдой. Я просто хочу подтвердить с вами. Спасибо за ваше понимание.   -  person Harish    schedule 16.04.2013
comment
Скорее всего так и есть, если выложите свой сетевой код будет проще сказать.   -  person A-Live    schedule 16.04.2013


Ответы (2)


Этот код дал вам какое-либо предупреждение?

Вы пытаетесь вернуть метод возврата NSArray * из void.

Измените его на

- (NSArray *) returnArray{ // YOU CAN RETURN id AS WELL, AS YOU ARE TYPE CASTING THE RESULT AT CALLING TIME
    // make api calls and return array
    NSLog (@"myArray :: %@", [myArray description]); // Post the output back here
    return myArray;
}

Дайте мне знать, если проблема не исчезнет.

РЕДАКТИРОВАТЬ

Установите точки останова в

allTopics = (NSArray *)[myhelper returnArray]; // AT - (void)viewDidLoad

и

return myArray; // AT HelperClass method

Если сначала он уволен первым, вам нужно реализовать, как @A-Live предложил в комментарии.

person viral    schedule 15.04.2013
comment
Мой плохой, я отредактировал свой вопрос. На самом деле я возвращаю NSArray. Когда я вызываю его из viewDidLoad, он просто возвращает ноль. - person Harish; 15.04.2013
comment
Итак, если он возвращает значение null, проблема заключается в вашей функции вспомогательного класса. Опубликуйте код для этого. - person Dancreek; 15.04.2013
comment
Когда я печатаю сообщение журнала в своем вспомогательном классе, он печатает объект json, как и ожидалось. Мой вспомогательный класс точно возвращает данные json. - person Harish; 15.04.2013
comment
@Viral, мой вспомогательный класс возвращает объект json, как и ожидалось. Он возвращает массив без нуля. - person Harish; 15.04.2013

Извините за публикацию ответа так поздно. Я понял, в чем проблема. Как упоминалось в @A-Live, вызовы Rest API с использованием AFNetworking используют асинхронные вызовы и, следовательно, не возвращают массив в основной поток в течение времени его выполнения. В моем случае,

-(void)viewDidLoad {

NSLog(@"I get called first");

MyHelper *helper = [[MyHelper alloc]init];

// returns array. However, [helper getData] is an async call under the hood. Hence myArray is nil
myArray = [helper getData];

}

Чтобы решить эту проблему, я воспользовался NSNotification.

@implementation MyHelper{

   -(NSArray *)getData(){

    [[NSNotificationCenter defaultCenter] postNotificationName:@"some.name.notification" object:JSON];

    }
}

-(void)viewDidLoad(){

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadData:) name:@"some.name.notification" object:nil];

}

-(void)loadData:(NSNotification *)notif {

// You can access the JSON object passed by the helper in here

NSArray *myArray = [notif object];

// do whatever you want with the array.

}

Я надеюсь, что я достаточно подробно. Я надеюсь, что это поможет кому-то и сэкономит много головной боли.

person Harish    schedule 17.04.2013