下载后收到通知?

时间:2009-03-21 08:58:41

标签: iphone

imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:srcAddres]];

将jpeg下载到我的imagedata将花费一些时间,例如:2秒,所以我想显示一个活动指示器,直到下载完成。我怎么知道下载何时完成?

3 个答案:

答案 0 :(得分:1)

您需要使用异步URL加载系统(iPhone SDK上的NSURLConnection)。这是Apple的文档:

http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html

答案 1 :(得分:0)

假设这项工作在控制器中,请按照建议使用NSURLConnection作为Graham Lee,并将self(控制器)设置为此对象的委托。

然后在控制器中声明以下方法(see this link for more information):

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

加载完成后,将调用您的代理人。顺便说一句,要显示网络活动指示器,您可以使用以下代码:

UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; // to stop it, set this to NO

再次,各位代表将在此为您提供帮助。

答案 2 :(得分:0)

你需要所谓的“选择器”。

我建议使用同步调用 - 但是在一个单独的线程中。这背后的原因是,尽管是异步,如果您在当前线程中传输数据,您仍将遇到UI缓慢问题。如果您正在使用全局网络活动指示器,这不是问题 - 但您的应用程序本地指示器(或任何其他屏幕重绘)将显示为已锁定。

因此,创建一个名为ImageDownloader(或某些人)的类,并将同步下载调用放在那里,以获取图像数据。作为您班级的成员之一,声明(在界面中):

SEL successSelector;

当您创建此类时(假设您要传入URL并获取图像数据,请创建以下形式的init函数(接收SEL),并使用以下命令调用它:

[ImageDownloader alloc] initWithSelector: @"http://url string" :self : @selector(yourFunction:)

基本上,你需要传递一个对象和该对象中的方法,以便在完成时回调。

'initWithSelector'实现如下:

-(id) initWithSelector: (NSString*)url :(id)adelegate :(SEL) successSeletor {
     self.url = url;
     self.delegate = adelegate;
     self.sel = successSelector;
}

(注意'yourFunction'之后的冒号 - 你的回调函数的每个参数都需要冒号。

所以yourFunction的签名如下:

-(void) yourFunction: (NSData*)imageData;

要从ImageDownloader类中调用它(下载完成后),只需使用以下命令调用选择器:

[delegate performSelector:sel withObject:imageData];

享受!