Cocoa Touch - 在加载UITabBar视图时显示活动指示器

3
我有一个UITabBar应用程序,其中包含两个视图,它们在它们的“viewWillAppear”方法中从Web加载大量数据。我想在检索这些数据时显示进度条或活动指示器,以确保用户知道应用程序没有冻结。
我知道这之前已经被问过了。我只需要对似乎是一个好的解决方案进行澄清。
我已经实现了示例中的代码。问题的原始提问者后来通过将数据检索放入另一个“线程”中来解决了他们的问题。我理解线程的概念,但我不知道如何实现这一点。
通过研究,我发现我需要将所有重型数据检索移动到后台线程中,因为所有UI更新都发生在主线程中。
如果您能够提供一个例子,我将非常感激。我可以根据需要提供我的现有代码的部分。
1个回答

3
如果您使用NSURLConnection,则它会自动在另一个线程上运行。
在您的viewDidLoad中:
NSURLRequest *req = [NSURLRequest requestWithURL:theURL];
NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];

那么你需要一些自定义方法。如果你输入-connection并按下Esc键,你将看到可以使用的所有不同方法。你需要使用其中的三个方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    // this is called when there is a response
        // if you're collecting data init your NSMutableData here
}

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // each time the connection downloads a 
        // packet of data it gets send here
        // so you can do [myData appendData:data];
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection {
        // the connection has finished so you can 
        // do what you want with the data here
}

基本上就是这样了。NSURLConnection可以自行处理所有的多线程操作,无需担心。现在你可以创建一个活动指示器并显示它,因为主线程是空的,所以它会工作。


好的。我会试一下这个。现在,我正在使用[Data dataWithContentsOfURL:URL]。 - Aurum Aquila
另外一件事:实际上,我想在“viewWillAppear”中进行数据加载,因为我正在加载的源数据可能会发生很大变化。我还支持用户名切换,这意味着我要加载的页面可能会在多种情况下显示视图。NSURLConnection方法在viewWillAppear函数中仍然有效吗?谢谢您的建议 :) - Aurum Aquila
是的...它可以在任何地方工作...你可以把这两行代码放在自己的自定义方法中,然后在任何时候从任何地方调用它。对于用户名切换,我可能会更进一步地说,你会想要将其放在一个自定义类中,而不是依赖于viewWillAppear。当用户切换用户名和功能时,你可以调用自定义对象中的一个方法来重新运行它。这样更整洁、更可靠,而且你有更多的控制权。 - Thomas Clayson
哇!这真是太棒了!视图瞬间加载,然后就会倾销内容。这使得整个过程更加响应迅速!感谢你的帮助。我以前从未明白为什么会有像“懒加载”这样的概念存在。现在我终于理解了。 - Aurum Aquila
确实。与所有的malloc、dealloc的东西相比,Objective-C中的内存管理要容易得多... - Aurum Aquila
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接