如何创建类似NSURLConnection的东西?

时间:2010-11-06 17:36:26

标签: iphone objective-c cocoa-touch ios nsurlconnection

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中的JSON值。现在,我必须像这样使用它:

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];

我知道如何创建此方法。我只是不知道如何在runloop完成并且自动释放池耗尽时保持connection活着,并确保在加载完成后释放connection。换句话说,我不知道如何复制NSURLConnection的确切行为。

2 个答案:

答案 0 :(得分:2)

从外部来看,NSURLConnection有效地保留了自己的意图和目的。这可以通过发送

来完成
[self retain];

开始连接然后

[self release];

完成后和通知代表后;或者通过将自己置于当前打开的连接池中并在完成时将其从该池中移除来完成。

你实际上不必做任何这些。 NSURLConnection保留其委托,因此您的JSON连接类应创建一个NSURLConnection,将自身作为NSURLConnection的委托传递。这样它至少和NSURLConnection一样长。它应该将JSON解析为方法-connectionDidFinishLoading:中的字典,并在返回之前将字典传递给其委托。返回后,NSURLConnection将释放并可能释放自身并释放您的JSON连接。

答案 1 :(得分:0)

有人应该在任何情况下跟踪连接的实时时间。在连接中追踪它是一个糟糕的解决方案。

IMO正确的方法是使用单例类来执行连接

@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];
}