imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:srcAddres]];
将jpeg下载到我的imagedata将花费一些时间,例如:2秒,所以我想显示一个活动指示器,直到下载完成。我怎么知道下载何时完成?
答案 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];
享受!