iphone Asynch下载和处理多个进程

时间:2011-06-28 19:47:05

标签: objective-c

我有一个基本的架构问题,关于如何处理异步下载或任何具有一系列事件的程序,并且每个事件都不会启动,直到先前的事件结束,无论需要多长时间。

如果我要下载数据,然后在下载完成后执行操作,但同时我希望做其他事情(比如显示进度指示器,启动画面或其他内容),是否有意义像这样设计程序:

-(void)thisMethodStartsTheDownloading{
       //start the download using NSURLConnection (I'm fine with these details)

       //show a UIView for a splash screen image or do anything else you want to do
 }


 -(void)thisMethodRunsWhenDownloadIsFinished{
        //hide or remove the splash screen (if applicable)
        //do whatever I need to do with the downloaded data
        //this method does not run on its own unless called when NSURLConnection is done
  }


  - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        //do whatever I need to do with my downloaded data

    [self performSelector:@selector(thisMethodRunsWhenDownloadIsFinished)];
       // or [self thisMethodRunsWhenDownloadIsFinished];
   }

  - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
       //incrementally appendData as it comes in from the download process
          [receivedData appendData:data];
   }

我想确保我理解在每个方法完成时在方法之间跳转的程序的结构

基本上,我假设当你有一系列流程,但是除非先前的链完成,否则该链的每个部分都无法运行,你就会把你的链分解成不同的方法,比如我已经完成了在这里,当当前的一个完成时,通过调用链中的下一个链接将它们相互链接。这是理想/标准的做法吗?

2 个答案:

答案 0 :(得分:1)

看看https://github.com/jdg/MBProgressHUD

你的想法是正确的。你简单地将每个调用链接到下一个,类似于如何工作UINavigationController。

将MBProgressHUD与http://allseeing-i.com/ASIHTTPRequest/之类的东西一起使用,将为您提供此类任务所需的几乎所有内容。

看看如何使用标准库来完成:

https://github.com/jdg/MBProgressHUD/blob/master/Demo/Classes/HudDemoViewController.m

答案 1 :(得分:1)

构建程序的标准且可靠的方法是将所有代码组织为对事件的响应。您的术语(“过程链”)对我来说并不熟悉,但听起来您在问这是否是将序列或脚本(您希望如何进行)转换为基于事件的环境的方法。

事实是,有时数据不是来自网络,也不是全部来自,或者需要很长时间。因此,将“下载数据”视为多步骤过程中的一个步骤会隐藏真正的应用程序需要处理的许多问题。

如果您的分步过程如下:

  1. 显示进度条
  2. 开始下载
  3. 循环:获取数据,更新进度条
  4. 隐藏进度条
  5. 用数据做事
  6. 所以是的,你把它翻译成事件和反应:

    • 该应用已完成启动:显示进度条,开始下载
    • 第一个数据到达:初始化缓冲区,将进度条设置为零
    • 更多数据到达:添加到缓冲区,更新进度条
    • 连接断开:显示提醒(再试一次,取消)
    • 用户点击再试一次:开始下载
    • 用户点击取消:删除进度条,显示其他内容
    • 下载完成:隐藏进度条,执行其他操作

    虽然第一种方式更易于作为叙述使用,但第二种方式可以更好地处理问题和边缘情况(例如,HTTP重定向导致“第一次数据到达”事件发生两次)。