Есть действительно два способа сделать это.
- Создание делегата интерфейса
- Использовать блоки
Я бы настоятельно рекомендовал не использовать синхронные методы - если только вы не / не создали вокруг них собственную асинхронную среду (т. Е. Вы вручную запускаете другой поток и выполняете свой синхронный запрос в этом потоке). В конечном итоге вы поймете, что запросы должны быть асинхронными, и вам придется заново обрабатывать все так, как они есть.
Чтобы дать краткий обзор двух вариантов, которые я дал:
1. Создайте делегат интерфейс
Идея состоит в том, чтобы создать класс, который выполняет запрос, и создать протокол, который должен вызывающий реализовать. Когда запрос будет завершен, вы вызовете указанный метод для делегата с данными:
Протокол может выглядеть примерно так:
@protocol RequestClassDelegate <NSObject>
- (void)requestCompleted:(ResponseClass *)data;
- (void)requestError:(NSError *)error;
@end
Класс, который делает запрос, может выглядеть примерно так:
@interface RequestClass : NSObject
- (void)makeRequest:(id<RequestClassDelegate>)delegate;
@end
И реализация класса запроса может содержать некоторые из следующего, в дополнение к вашей логике соединения:
@implementation RequestClass
{
__weak id<RequestClassDelegate> _delegate;
}
// Connection Logic, etc.
- (void)makeRequest:(id<RequestClassDelegate>)delegate
{
_delegate = delegate;
// Initiate the request...
}
-(void) connectionDidFinishLoading:(NSURLConnection *) connection
{
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
// Processing, etc.
// Here we'll call the delegate with the result:
[_delegate requestCompleted:theResult];
}
@end
2. Использовать блоки
Это решение во многом совпадает с первым решением, но, на мой взгляд, более элегантно. Здесь мы изменим RequestClass
на использование блоков вместо делегата:
typedef void (^requestCompletedBlock)(id);
typedef void (^requestErrorBlock)(NSError *);
@interface RequestClass : NSObject
@property (nonatomic, copy) requestCompletedBlock completed;
@property (nonatomic, copy) requestErrorBlock errored;
- (void)makeRequest:(requestCompletedBlock)completed error:(requestErrorBlock)error;
@end
И реализация этого может выглядеть примерно так:
@implementation RequestClass
@synthesize completed = _completed;
@synthesize errored = _errored;
// Connection Logic, etc.
- (void)makeRequest:(requestCompletedBlock)completed error:(requestErrorBlock)error
{
self.completed = completed;
self.errored = error;
// Initiate the request...
}
-(void) connectionDidFinishLoading:(NSURLConnection *) connection
{
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
// Processing, etc.
// Here we'll call the delegate with the result:
self.completed(theResult);
}
@end