Что вам действительно нужно сделать, это создать @protocol
, который создает делегат для вашего вспомогательного класса. Затем измените -(NSMutableArray)getMovies:(NSURL*)url
на -(void)getMovies:(NSURL*)url
Класс, вызывающий ваш вспомогательный метод, должен реализовать делегат вашего вспомогательного метода.
Затем - (void)connectionDidFinishLoading:(NSURLConnection *)connection
вызывает метод (ы) делегата. Лучше иметь один для успеха и один для неудачи.
= Начало обновления =
Вам также необходимо определить id delegate
в вашем файле помощника, который вызывающий класс устанавливает для себя после init, но перед вызовом -(void)getMovies:(NSURL*)url
. Таким образом, вспомогательный файл знает, куда нужно перезвонить.
getMovies *movieListCall = [[getMovies alloc] init];
movieListCall.delegate = self;
[movieListCall getMovies:<your NSURL goes here>];
Вы увидите несколько дополнительных строк для включения delegate
в файлы getMovies.h и getMovies.m.
= конец обновления =
в вашем файле getMovies.h добавьте:
@protocol getMoviesDelegate
@required
- (void)getMoviesSucceeded:(NSMutableArray *)movieArray;
- (void)getMoviesFailed:(NSString *)failedMessage;
@end
@interface getMovies : NSOBject {
id delegate;
}
@property (nonatomic, assign) id delegate;
в вашем файле getMovies.m добавьте:
@synthesize delegate;
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
//TODO error handling for connection
if ([delegate respondsToSelector:@selector(getMoviesFailed:)]) {
[delegate getMoviesFailed:[error localizedDescription]];
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
//finishes with
if ([delegate respondsToSelector:@selector(getMoviesSucceeded:)]) {
[delegate getMoviesSucceeded:listOfMovies];
}
}
обновить .h файл класса вызовов для использования getMoviesDelegate
:
@interface MoviesView : UIViewController <getMoviesDelegate>{
.
.
.
}
добавить методы getMoviesDelegate
в файл .m вашего вызывающего класса
- (void)getMoviesSucceeded:(NSMutableArray *)movieArray {
//deal with movieArray here
}
- (void)getMoviesFailed:(NSString *)failedMessage {
//deal with failure here
}
Это не проверено, но, надеюсь, дает вам дорожную карту для работы.
Протоколы хороши тем, что вы можете создавать как обязательные, так и необязательные методы делегирования, и это помогает в уточнении ваших вспомогательных методов, чтобы их можно было многократно использовать в разных проектах. Компилятор также предупредит вас, если вы внедрили протокол, но не внедрили требуемые протоколом методы делегата. Если вы следуете по этому пути, обязательно используйте conformsToProtocol:
и respondsToSelector: