我正在使用stringWithcontentsofurl从我的Web服务器下载一些字符串到App,但我想更新UI以显示某种类型的加载器。我正在下载一些字符串(它有时可能多达100个)因此用户可以很好地展示一些东西,这样他们就知道应用程序没有崩溃,因为现在UI被卡住了,我无法显示UILoader或类似的东西。有没有选择吗?或者也许是stringWithcontentsofurl的另一种选择吗?
映入眼帘, 埃里克
答案 0 :(得分:3)
试试这个。它在背景中加载东西。如果稍后更新UI(在asyncload中),请确保在主线程上执行此操作。
-(void)loadappdetails:(NSString*)appid {
NSString* searchurl = [@"https://itunes.apple.com/lookup?id=" stringByAppendingString:appid];
[self performSelectorInBackground:@selector(asyncload:) withObject:searchurl];
}
-(void)asyncload:(NSString*)searchurl {
NSURL* url = [NSURL URLWithString:searchurl];
NSError* error = nil;
NSString* str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
NSLog(@"Error: %@", error);
}
NSLog(@"str: %@", str);
}
答案 1 :(得分:0)
不幸的是,stringWithContentsOfURL
是一种同步方法,这意味着它会阻塞你的线程,并且在运行时你不会收到任何回调。这对用户体验也不利。
另一种方法是使用NSURLConnection手动设置您自己的请求,然后点击连接的委托方法以显示某种进度条。具体来说,您需要使用connection:didReceiveData:
和connectionDidFinishLoading:
收到所有数据后,请使用以下内容获取字符串。
NSString *theString = [[NSString alloc] initWithData:yourData encoding:UTF8StringEncoding];
答案 2 :(得分:0)
这是“懒惰加载”的经典案例。请参阅Apple的示例代码:
http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html
在阅读该代码时,将“字符串”替换为“图像”应该很容易。
您希望在标签中显示占位符,如“(获取信息)”或类似内容,然后在后台加载信息,自行线程化提取(异步提取)或使用处理所有异步的ASIHTTPRequest等库为您提供的螺母和螺栓,一旦完成提取,就调用一个委托方法。
答案 3 :(得分:0)
要使此方法异步,可以并且建议使用Grand Central Dispatch。如果有人有兴趣,我会展示几行代码。