Как создать что-то вроде NSURLConnection? - PullRequest
0 голосов
/ 06 ноября 2010
NSURL *URL = [NSURL URLWithString:@"http://www.stackoverflow.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];

С таким простым кодом я могу загрузить веб-страницу в своем приложении.Мне не нужно беспокоиться о сохранении или освобождении NSURLConnection, он будет автоматически освобожден после завершения загрузки.

Я создаю какую-то оболочку вокруг NSURLConnection, JSONConnection.Это позволяет мне загружать значение JSON с веб-страницы и автоматически анализировать его в NSDictionary.Прямо сейчас я должен использовать это так:

JSONConnection *tempJSONConnection = [[JSONConnection alloc] initWithURLString:@"http://www.stackoverflow.com" delegate:self];
self.JSONConnection = tempJSONConnection;
[tempJSONConnection release];

Затем, когда загрузка закончится, я звоню self.JSONConnection = nil;.

Что я хочу, так это сделать:

JSONConnection *connection = [JSONConnection connectionWithURLString:@"http://www.stackoverflow.com" delegate:self];

Я знаю, как создать этот метод.Я просто не знаю, как сохранить connection активным, когда завершится цикл запуска, и пул авто-релиза истощен, и убедитесь, что connection освобожден после завершения загрузки.Другими словами, я не умею дублировать точное поведение NSURLConnection.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2010

Во всех отношениях извне NSURLConnection эффективно сохраняет себя. Это было либо сделано путем отправки

[self retain];

при запуске соединения, а затем

[self release];

по окончании и после информирования делегата; или это было сделано путем помещения себя в пул открытых в данный момент соединений и удаления его из этого пула по завершении.

На самом деле вам не нужно ничего этого делать. NSURLConnection сохраняет свой делегат, поэтому ваш класс соединения JSON должен создать NSURLConnection, передавая себя как делегат NSURLConnection. Таким образом, он будет жить по крайней мере столько же, сколько NSURLConnection. Он должен проанализировать JSON в словарь в методе -connectionDidFinishLoading: и передать словарь его делегату перед возвратом. После возврата NSURLConnection освободит и, возможно, освободит себя, а также освободит ваше JSON-соединение.

0 голосов
/ 06 ноября 2010

Кто-то должен отследить время жизни соединения в любом случае.Это плохое решение для отслеживания его внутри соединения.

ИМО, правильный способ сделать это - использовать синглтон-класс для выполнения соединений

@protocol JSONDataProviderDelegate <NSObject>
- (void) JSONProvider:(JSONDataProvider*) provider didLoadJSON:(JSONObject*) object;
- (void) JSONProvider:(JSONDataProvider*) provider didFainWithError:(NSError*) error;
@end

@interface JSONDataProvider : NSObject

+ (void) provideJSON:(NSURL*) url delegate:(id<JSONDataProviderDelegate>) delegate;
+ (void) removeDelegate:(id<JSONDataProviderDelegate>delegate);

@end

Использование:

- (void) onSomeEvent
{
  [JSONDataProvider provideJSON:[NSURL URLWithString:@"http://example.com/test.json"] delegate:self];
}

- (void) JSONProvider:(JSONDataProvider*) provider didLoadJSON:(JSONObject*) object
{
  NSLog(@"JSON loaded: %@", object);
}
 - (void) dealloc
{
  [JSONDataProvider removeDelegate:self];
  [super dealloc];
}
...