обратные вызовы через селекторы target-c - PullRequest
2 голосов
/ 09 июня 2010

У меня есть класс «BSjax», который я написал и который позволяет мне выполнять асинхронные вызовы на наш сервер для получения наборов результатов json и т. Д. С использованием класса ASIHTTPRequest. Я настроил его так, чтобы класс BSjax анализировал ответ json моего сервера, а затем передает управление обратно в вызывающий контроллер представления через этот вызов:

[[self delegate] performSelectorOnMainThread:@selector(bsRequestFinished:) withObject:self waitUntilDone:YES];

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

Мне кажется, что возможность передавать разные имена функций обратного вызова в мой класс BSjax было бы самым чистым исправлением ... но у меня возникли проблемы (и я даже не уверен, если это возможно) передать переменную, которая содержит имя функции обратного вызова, а затем замените вышеуказанный вызов чем-то вроде этого:

[[self delegate] performSelectorOnMainThread:@selector(self.variableCallbackFunctionName) withObject:self waitUntilDone:YES];

... где «self.variableCallbackFunctionName» устанавливается вызывающим контроллером представления, когда он вызывает BSjax для создания нового запроса.

Это вообще возможно? Если да, то желательно? Если нет, альтернативы?

РЕДАКТИРОВАТЬ: Обратите внимание, что при любом исправлении, которое я получу, нужно будет учитывать реальность того, что этот класс выполняет асинхронные запросы ... поэтому я должен убедиться, что обработка функции обратного вызова правильно привязана к конкретным запросам. ... поскольку я не могу полагаться на последовательность обработки FIFO.

РЕДАКТИРОВАТЬ 2: похоже, что передача переменной типа SEL - это путь? Сейчас я борюсь с тем, чтобы выяснить синтаксис для сохранения его как сохраненного свойства класса BSjax.

Ответы [ 2 ]

3 голосов
/ 09 июня 2010

Вы можете передавать селекторы как значения SEL.Например:

SEL oneSelector = @selector(bsRequestFinished:);
SEL anotherselector = @selector(somethingElse:);
NSString *nameOfSelector = askUserForSelectorName();
SEL dynamicSelector = NSSelectorFromString(nameOfSelector);

Так что просто сделайте ваш variableCallbackFunctionName SEL, и это даже проще, чем вы надеялись:

2 голосов
/ 09 июня 2010

Какой тип переменной является variBkecallbackfunctionname?NSString?Если это так, вы, вероятно, захотите что-то вроде этого:

[[self delegate] performSelectorOnMainThread:NSSelectorFromString(self.variableCallbackFunctionName) withObject:self waitUntilDone:YES];

Я нахожусь на iPad, поэтому не могу проверить это, но попробуйте.если variableCallbackFunctionName не является nsstring, проще всего сделать это, если я понимаю ваш вопрос.

...