1

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

  1. ViewDidLoad 生成NSURLConnection,调用它的委托,当连接结束时,生成解析器和解析器数据,然后保存到数据库。(同一类中的所有内容)

另一种方法是

  1. 创建一个单独的类,它将管理所有 NSURLConnections + NSXMLParser,并在ViewDidLoad或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];

然后在doSomething中,调用您的连接文件

任何人都可以定义以非常有条理和适当的方式下载和保存的最佳方式,以便它易于管理并且不会出现 View 挂起。

4

3 回答 3

1

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

推荐方式,

  1. NSOperationNSOperationQueue
  2. GCD
  3. 使用 3rd 方框架AFNetworkingMKNetworkKit

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

我建议不要使用[self performSelectorInBackground:@selector(doSomething) withObject:nil];. 如果您不知道如何使用它会变得混乱,而是使用 GCD。


编辑

通常,我遵循的,

  • NSOperationWebservice 引擎类,它使用and处理 Web 服务调用NSOperationQueue(您可以使用 GCD 或其他框架)。任何调用 WS 的视图控制器都将与此类对话。
  • Parser 类将接收来自 Web 服务引擎的 WS 响应。它将解析响应并创建模型类。完成后,它会将解析后的响应委托给 Web 服务引擎,并从这里委托给视图控制器。
  • 错误处理和进度指示在 Web 服务引擎中处理。
  • 重要提示:从视图控制器发出请求的点,处理发生在由NSOperationQueue. 因此不会冻结 UI。

对 WS 的调用在 中启动viewDidLoad,并显示进度指示器,直到流程完成。但有时要求是在下载 WS 响应之前不创建视图控制器。因此,发起请求的选择取决于您的要求。

于 2013-09-25T11:03:26.193 回答
1

从 iOS4+ Apple 开始引入 GCD。请参阅并发编程指南:调度队列

这可能是做异步工作(尤其是网络电话)的最佳和最推荐的方式。

例子

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]; 
    });

});
于 2013-09-25T11:14:02.273 回答
0

我的建议是,您可以使用 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
            });




    });
于 2013-09-25T11:15:08.213 回答