Ваш подход разумен, однако я не уверен, почему вы создаете свой собственный протокол. Это не обязательно. Все, что вам нужно для реализации этого, находится в документации Apple по NSURLConnection . Если вы возьмете код с той страницы, где создается экземпляр NSURLConnection, и сделаете соединение ivar вместо того, чтобы просто создать его как локальную переменную, вы можете сравнить объекты соединения в каждом из методов обратного вызова и ответить соответствующим образом. Например, возьмите этот код из документации и измените объект подключения на ivar:
// create the request
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
// Create the NSMutableData that will hold
// the received data
// receivedData is declared as a method instance elsewhere
receivedData=[[NSMutableData data] retain];
} else {
// inform the user that the download could not be made
}
Переменная theConnection - это наш ivar. Тогда вы можете проверить это так:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
if (connection == theConnection)
{
// do something with the data object.
[connectionSpecificDataObject appendData:data];
}
}
Вы, безусловно, можете реализовать его, создавая собственный протокол, как вы предлагаете, и затем вызывать делегата, который соответствует вашему протоколу, но вам может быть лучше просто создать экземпляр своего объекта с помощью селектора успеха и неудачи, который вы можете проверять. Примерно так:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if (connection == theConnection)
{
if (delegate && [delegate respondsToSelector:successSelector])
[delegate performSelector:successSelector
withObject:connectionSpecificDataObject];
}
[connection release];
}
Где dataDidDownloadSelector - это переменная экземпляра SEL, которую вы задали при создании делегата загрузки, в котором содержится весь этот код, - вашего объекта Proxy. Примерно так:
Proxy *p = [[Proxy alloc] init];
[p searchForSomethingAsync:searchText
delegate:self
successSelector:@selector(didFinishWithData:)
failSelector:@selector(didFailWithError:)];
Реализуйте свои селекторы так:
- (void)didFinishWithData:(NSData*)data;
{
// Do something with data
}
- (void)didFailWithError:(NSError*)error
{
// Do something with error
}
Это стало более длинным ответом, чем я предполагал. Дайте мне знать, если это не имеет смысла, и я могу попытаться уточнить.
С уважением,