У меня есть несколько представлений, которые делают одно и то же NSURLRequest/NSURLConnection request
. В идеале, чтобы получить повторное использование кода, я хотел бы иметь какой-то «прокси», который выполняет всю основную работу по созданию/выполнению (асинхронного) запроса/соединения, настройке всех методов делегата и т. д. , поэтому мне не нужно копировать все эти NSURLConnection
обработчики методов делегата в каждом представлении. Прежде всего, разумен ли такой подход к проектированию? Во-вторых, как я могу сделать что-то подобное?
Для небольшой справочной информации я попытался это сделать и заставил его «работать», однако, похоже, он не выполняется асинхронно. Я создал файл Proxy.h/m, в котором есть методы экземпляра для различных вызовов веб-сервиса (а также методы NSURLConnection
делегата):
@interface Proxy : NSObject {
NSMutableData *responseData;
id<WSResponseProtocol> delegate;
}
- (void)searchForSomethingAsync:(NSString *)searchString delegate:(id<WSResponseProtocol>)delegateObj;
@property (nonatomic, retain) NSMutableData *responseData;
@property (assign) id<WSResponseProtocol> delegate;
@end
WSResponseProtocol определяется следующим образом:
@protocol WSResponseProtocol <NSObject>
@optional
- (void)responseData:(NSData *)data;
- (void)didFailWithError:(NSError *)error;
@end
Чтобы использовать это, контроллер представления просто должен соответствовать протоколу WSResponseProtocol
, чтобы перехватывать ответы. Вызов веб-службы выполняется следующим образом:
Proxy *p = [[Proxy alloc] init];
[p searchForSomethingAsync:searchText delegate:self];
[p release];
Я могу предоставить больше кода, но остальное можно предположить. Перед вызовом я «начинаю анимацию» UIActivityIndicatorView
счетчика. Но спиннер никогда не крутится. Если я просто поставлю методы делегата NSURLConnection прямо в контроллер представления, то спиннер крутится. Итак, это заставляет меня думать, что моя реализация не выполняется асинхронно. Любые мысли/идеи здесь?