代码之家  ›  专栏  ›  技术社区  ›  Duaan

从服务器下载数据并在UITableViewController或UIViewController中显示而不卡住GUI的最佳方式是什么?

  •  1
  • Duaan  · 技术社区  · 11 年前

    有许多结构可以从服务器下载数据。喜欢

    1. 查看DidLoad 进行NSURLConnection,调用其委托,当连接结束时,生成解析器和解析器数据,然后保存到DB。(所有东西都在同一个班上)

    另一种方式是

    1. 制作一个单独的类,该类将管理所有NSURLConnection+NSXMLParser,并在中制作该类的对象 查看DidLoad 任何其他方法 ViewController类的。

    另一种方式是

    1. 制作一个文件以设置连接,并制作另一个文件来管理解析器

       ViewController =====================>> URLConnection
       Delegate of URLConnectionfile =====================>> ViewController 
      

    然后,在这个委托中,从服务器下载的NSData被进一步发送到Parser类

       ViewController =======================>> ParserClass
      Delegate of Parser gives Array to ================= ViewController
    

    然后显示该数组

    另一种方法是使用线程

    1. 在中调用此类方法

      [self-performSelectorInBackground:@selector(doSomething)withObject:nil];

    然后在 做点什么 ,调用您的连接文件

    有人能以一种非常有组织和正确的方式定义下载和保存的最佳方式吗?这样就可以轻松管理,而且不会出现视图挂起的情况。

    3 回复  |  直到 3 年前
        1
  •  1
  •   Nimantha Dave Sherohman    3 年前

    不要在主线程上操作下载和解析代码。这就是 唯一的方式 以避免UI冻结。

    推荐的方法,

    1. NSOperation NSOperationQueue
    2. 全球气候变化大会
    3. 使用第三方框架,如 AFNetworking , MKNetworkKit

    此外,如果您的表视图中有图像,请使用称为延迟加载的技术。

    我建议不要使用 [self performSelectorInBackground:@selector(doSomething) withObject:nil]; 。如果你不知道如何使用,那就太麻烦了,不如使用GCD。


    编辑

    通常,我遵循的是,

    • 处理web服务调用的web服务引擎类 NS操作 操作队列 (您可以使用GCD或其他框架)。任何对WS进行调用的视图控制器都将与这个类进行对话。
    • 解析程序类将从Web服务引擎接收WS响应。它将解析响应并创建模型类。完成后,它将把解析后的响应委托给Web服务引擎,并从这里委托给视图控制器。
    • 错误处理和进度指示在Web服务引擎中进行处理。
    • 重要的 :从视图控制器发出请求的点,处理发生在由创建的后台线程上 操作队列 。因此不会冻结UI。

    在中启动对WS的调用 viewDidLoad ,显示进度指示器,直到进程完成。但有些时候的要求是在下载WS响应之前不会创建视图控制器。所以选择发起请求是基于您的需求。

        2
  •  1
  •   Xcoder    11 年前

    从iOS4+苹果推出了GCD。看见 Concurrency Programming Guide: Dispatch Queues

    这可能是做异步工作(尤其是网络调用)的最佳和最推荐的方法。

    实例

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    
        NSHTTPURLResponse *response = nil;
        NSError *error = nil;
        NSData *responseData = nil;
    
        NSDictionary *responseDictionary = nil;
        responseData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60] returningResponse:&response error:&error];
    
        //Update the UI after this
        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateUIAfterParsing]; 
        });
    
    });
    
        3
  •  0
  •   wesley    11 年前

    我的建议是,你可以使用GrandCentralDispatch(GCD)

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    
            for(NSString *urlString in self.urlArray)
            {
                NSURL *url=[NSURL URLWithString:urlString];
                NSData *data=[NSData dataWithContentsOfURL:url];
    
                UIImage *image=[UIImage imageWithData:data];
    
               //delegate to parse the content/data  
               //delegate to save data/images into documents directory/DB 
    
    
             }
    
                dispatch_async(dispatch_get_main_queue(), ^{
    
                    //UIUpdation, fetch the image/data from DB  and update into your UI
                });
    
    
    
    
        });