为了在目标c中使用异步http请求,您需要将委托设置为NSURLConnection
。问题是我需要发出多个http请求,所以拥有相同的委托(自己)不会工作。
最好的方法是什么?我应该为每个http请求创建一个新的委托类吗?这些代表只是NSObjects吗?
答案 0 :(得分:5)
您有几个选择。最常见的两个是:
为每个连接创建一个新类(是的,NSObject
的子类)并将它们设置为委托 - 让它们执行加载数据时所需的任何逻辑
将一个类设置为委托,并存储对所有NSURLConnection
的引用。这样,当您的代理人被- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
调用时,您可以测试正在使用的NSURLConnection
(例如if ([connection == myConnection])
- 或者您正在实施的任何代理方法)
答案 1 :(得分:1)
答案 2 :(得分:1)
我所做的是创建一个处理下载文件的类,并在通过选择器完成时通知我。我传递了一个委托,一个选择器和执行下载所需的信息。
- (void) downloadFileFrom:(NSString*) httpLocation respondAt:(SEL)selector on:(id)target withParam:(id)param
{
self.finishSelector = selector;
self.delegate = target;
self.responseParams = param;
}
Class是它自己的NSURLConnection委托。因此,实例与我可能实例化的其他实例分开,并且它处理创建自己的结果以供我使用。我抓住了param对象。这可能是任何事情。
在下载结束时,它会在委托上执行performSelector :.将自己传递给代表。
if ([self.target respondsToSelector:self.selector])
{
[self.target performSelector:self.selector withObject:self.param];
}
然后你可以创建一个下载器的实例并调用你的方法...告诉它在哪里回复你。
MyDownloader downloader = [[MyDownloader alloc] init];
[downloader downloadFileFrom:@"http://www.mydomain.com/myimage" respondAt:@selector(myFileIsComplete:) on:self withParam: downloader];
[downloader autorelease];
另一种选择是为您的类创建一个@protocol来响应,并让您委派符合响应者。
答案 3 :(得分:0)
这应该有效,但还有另一种选择。您可以创建一个创建并调用NSURLConnection
的通用类,只要它们足够通用即可。然后保留NSArray
或NSDictionary
个类。每个连接一个。
示例:我有一个需要同时下载多张照片的应用。因此,我有一个GetFlickrPhoto
课程。它有一个自定义的init方法,可以接收URL和任何其他必要的信息。每个单独的类都会创建NSURLConnection
,并可以安全地将委托设置为self
这有助于保持内容并且易于管理/重用。
更进一步:
我之前提到的应用程序,也需要下载JSON提要。所以我创建了一个GenericDownload
类,它接受了URL并异步下载了NSData
,然后通过定义的成功/失败协议将NSData
返回给调用委托。它并不关心NSData
包含的内容。
我重新设计GetFlickrPhoto
以致电GenericDownload
并使用返回的NSData
来拍照。然后我创建了一个名为GetJSON
的{{1}}类,并将返回的GenericDownload
解析为JSON提要。
需要更多时间,但最终你会对维护和未来的项目感到高兴。