【问题标题】:How to load content into TableView without blocking the UI?如何在不阻塞 UI 的情况下将内容加载到 TableView?
【发布时间】:2011-09-13 20:00:47
【问题描述】:

我正在开发一个 TableView,该控制器从 Web 提要下载数据、解析并在此 TableView 中填充其内容。提要仅以 10 项为一组提供数据。因此,例如,当有 112 个项目时加载数据可能需要大约 12 个服务器请求。我想在不阻塞用户屏幕的情况下发出这些请求,它应该按顺序加载数据,就像它无法加载第 5 页上的项目一样,除非它已经获取了前一个项目(1、2、3、4 以这个确切的顺序示例)。

关于如何实现这一点的任何想法?

提前感谢您的帮助,

斯蒂芬

【问题讨论】:

    标签: iphone objective-c ios uitableview nsoperation


    【解决方案1】:

    使您的网络调用异步。不要在主 UI 线程上进行网络调用...

    例如,如果您使用 ASIHttp library 进行 http 调用(这是基于 Apple 的 NSURLConnection 构建的),则发出异步请求就像 -

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request startAsynchronous];
    

    当获取数据时,会调用这些选择器回调 -

    - (void)requestFinished:(ASIHTTPRequest *)request
    {
       // Use when fetching text data
       NSString *responseString = [request responseString];
    
       // Use when fetching binary data
       NSData *responseData = [request responseData];
    }
    
    - (void)requestFailed:(ASIHTTPRequest *)request
    {
       NSError *error = [request error];
    }
    

    这肯定会让你的 UI 响应式...

    还要记住只在主线程上更新 UI 元素。从后台线程开始更新 ui 元素很容易。所以请记住...

    【讨论】:

    • Ryan,当你说只在主线程上更新 UI 元素时,你的意思是使用 performSelectorOnMainThread,对吧?
    【解决方案2】:

    您不需要使用其他 API,可以使用 Apple 自己的NSURLConnection。它可以同步或异步检索数据。当然,在您的情况下,后者是必要的。您将数据保存在请求的委托方法中。

    – connection:didReceiveResponse:
    – connection:didReceiveData:
    – connection:didFailWithError:
    – connectionDidFinishLoading:
    

    另外,请参阅我最近对this question 的更完整回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多