使用stringWithContentsofurl时更新UI

时间:2011-08-10 00:06:00

标签: iphone string user-interface download

我正在使用stringWithcontentsofurl从我的Web服务器下载一些字符串到App,但我想更新UI以显示某种类型的加载器。我正在下载一些字符串(它有时可能多达100个)因此用户可以很好地展示一些东西,这样他们就知道应用程序没有崩溃,因为现在UI被卡住了,我无法显示UILoader或类似的东西。有没有选择吗?或者也许是stringWithcontentsofurl的另一种选择吗?

映入眼帘, 埃里克

4 个答案:

答案 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。如果有人有兴趣,我会展示几行代码。