2013-05-24 2 views
1

В коде SimpleStocks выборки, представленной Apple, Datasource определяется следующим образом:SimpleStocks (Apple пример кода)

property (nonatomic, weak) IBOutlet id <APLSimpleStockViewDataSource> dataSource; 

, а затем использовали по-разному следующим образом (только 2 примера, но есть больше в код)

NSInteger dataCount = [self.dataSource graphViewDailyTradeInfoCount:self]; 
NSArray *sortedMonths = [self.dataSource graphViewSortedMonths:self]; 

Я понимаю, что делает graphViewDailyTradeInfoCount, а также graphViewSortedMonths.I поняли бы: NSInteger dataCount = [APLStockViewController graphViewDailyTradeInfoCount:self]; (Пробовал, и я думаю, я знаю, почему это не может работать)

Вот так: Как я прочитал первую строку кода, dataSource отправляется сообщение graphViewDailyTradeInfoCount (которое возвращает некоторое числовое значение, определяющее, сколько транзакций произошло). Если мы предположим 25 транзакций, в основном [dataSource 25]; И теперь мой разум ошеломляет, потому что я сильно ожидаю, что где-то будет код, рассказывающий dataSource, что делать с отправленным 25. Но нет!

Тогда ошеломляющее усилие увеличивается на порядок: dataSource отправил 25, он теперь возвращает это и помещает его в dataCount. Как это известно, для этого нет кода, который я могу найти для этого.

И теперь, щекочу меня баллистическим, во второй строке кода dataSource знает, чтобы принять (а затем вернуть) NSArray.

В мои более редкие разумные моменты мне кажется, что dataSource действительно не делает ничего, кроме «прохода», которое ему передается. Компьютеры не могут делать магии, это похоже на функцию, но где она задокументирована?

Спасибо!

ответ

1

Вот так: Как я прочитал первую строку кода, dataSource отправляется сообщение graphViewDailyTradeInfoCount (которое возвращает некоторое числовое значение, определяющее, сколько транзакций произошло).

Исправить.

Если мы предположим 25 транзакций, в основном [источник данных 25];

Неверный (на основе [] и вашего описания вы думаете, что мы отправляем 25 в источник данных). После звонка, dataCount = 25.

Звонок просит источник данных вернуть нам данные. Он передается в источник данных (:self) для информационных целей, но целью запроса является получение информации из источника данных.

Теперь, когда у нас есть 25 (хранится в dataCount), мы можем что-то с этим сделать.

Аналогично, во второй строке кода источник данных просто возвращает массив. Мы не передаем ему массив.

За предыдущий мини вопрос:

NSInteger dataCount = [APLStockViewController graphViewDailyTradeInfoCount: само];

Это не может работать, потому что APLStockViewController - это класс. Нам нужно поговорить с экземпляром класса (в который входит self.dataSource).

+0

Спасибо, но я на самом деле не делаю этого: 'NSInteger dataCount = [[self dataSource] graphViewDailyTradeInfoCount: self];' и не так: сначала получает указатель на объект dataSource, используя (неявный) getter (с фрагментом '[self dataSource]', второй, отправив этому объекту сообщение graphViewDailyTradeInfoCount: (с параметром self), который, третий, заставляет объект возвращаться (NSInteger), который хранится в dataCount? Но как объект dataSource знает, как вернуть этот NSInteger (и позже NSArray), если у него нет каких-либо методов? Извините за будучи настолько тупым. –

+0

(Спасибо Джошу Касуэлю за то, что он указал на эквивалент синтаксиса, отличного от точки. Aaron Hillegass 'Obj-C BNR Guide предлагает избегать точечной нотации). –

0

Я думаю, что вы, возможно, слишком усложняете работу делегатов и источников данных. Источник данных указывает на некоторый экземпляр некоторого объекта.

Когда какой-то объект сказал, что это APLSimpleStockViewDataSource, он говорил, что он реализовал некоторые методы, включая graphViewDailyTradeInfoCount: и graphViewSortedMonths:. Этот объект имеет SomeInstanceOfAPLSimpleStockView.datasource = self (или что-то имя класса, в котором вы работаете было) где-то в его создании, как init или viewdidload

Это так же, как если бы вы были некоторые MyObject* myobj, которые реализованы эти методы, и вы [myobj graphViewSortedMonths:self

+0

Я просто перечитываю последний абзац вашего сообщения ... Это часть - это правильно. Источник данных - это просто указатель с некоторыми удобными функциями. – popctrl

+0

«Это то же самое, если у вас был MyObject * myobj, который реализовал эти методы, и вы вызвали [myobj graphViewSortedMonths: self " Вот и все! Спасибо Энтони (и переполнение стека) –