Функциональные указатели в Objective-C - PullRequest
1 голос
/ 11 мая 2010

У меня есть следующий сценарий:

Class_A
  - method_U
  - method_V
  - method_X
  - method_Y

Class_B
  - method_M
  - method_N

HttpClass
  - startRequest
  - didReceiveResponse // is a callback

Теперь я хочу реализовать эти три потока (на самом деле их гораздо больше, но их достаточно, чтобы продемонстрировать мой вопрос):

Class_A :: method_X -> HttpClass :: startRequest:params -> ... wait, wait, wait ... -> HttpClass :: didReceiveResponse -> Class_A :: method_Y:result

и

Class_A :: method_U -> HttpClass :: startRequest:params -> ... wait, wait, wait ... -> HttpClass :: didReceiveResponse -> Class_A :: method_V:result

и последний:

Class_B :: method_M -> HttpClass :: startRequest:params -> ... wait, wait, wait ... -> HttpClass :: didReceiveResponse -> Class_B :: method_N:result

Обратите внимание, что методы в Class_A и Class_B имеют разные имена и функции, они просто делают нас одинаковыми HttpClass.

Мое решение теперь состоит в том, чтобы передать указатель функции C на startRequest, сохранить его в HttpClass, и когда будет вызван didReceiveResponse, я вызову указатель функции и передам результат (который всегда будет JSON Dictionary ).

Теперь мне интересно, могут ли быть проблемы с использованием простого C или есть лучшие решения, делающие это более объективно-C-способом. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 11 мая 2010

Вы можете использовать селекторы вместо указателей функций. В основном, вы настроили для первого сценария:

// declare startRequestWithDelegate method
- startRequestWithDelegate:(id)delegate selector:(SEL)selector;

// call it in Class_A object:
[HTTPObject startRequestWithDelegate:self selector:@selector(method_Y:);

// call callback method when request finished:
if ([delegate respondsToSelector:savedSelector])
   [delegate performSelector:savedSelector withObject:result];

Другие сценарии будут отличаться при вызове startRequestWithDelegate метода.

1 голос
/ 11 мая 2010

Я могу придумать несколько способов сделать это, каждый из которых имеет свои преимущества (и недостатки):

  • Иметь HttpClass отправлять уведомления в didReceiveResponse, для которых Class_A и Class_B могут прослушивать
  • Передайте Class_A и Class_B в качестве делегатов в HttpClass, который будет вызываться в didReceiveResponse
  • Использование обратного вызова цели и действия (очень похоже на делегированный подход)

Лично я бы использовал делегатов - было бы проще добавить больше функциональности в будущем, и это более надежно, чем использование прямых указателей на функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...