【问题标题】:How can I avoid data corruption with multiple instances of NSUrlConnection如何避免 NSUrlConnection 的多个实例导致数据损坏
【发布时间】:2010-12-05 06:50:51
【问题描述】:

我编写了一个 iOS 应用程序,它多次调用 NSUrlConnection 以从网络下载图像数据。有时,一个 NSUrlConnection 在另一个启动之前还没有完成。我看到损坏的 jpeg 数据,我认为这是因为我的 didReceiveData 委托正在保存来自两个单独的 NSUrlConnections 的数据并将两个 jpeg 数据流混合到一个数据变量中,从而导致损坏。

我的问题是:避免这种情况的最佳方法是什么?似乎没有办法让每个 NSUrlConnection 实例保存到单独的数据变量,或者让每个实例等到前一个实例完成后再保存。

我的代码基本上遵循 Apple 的示例,除了我多次调用 loadData 函数来创建 NSURLRequest 和 NSURLConnection。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

提前感谢您的帮助。

【问题讨论】:

    标签: cocoa-touch ios nsurlconnection nsurlrequest nsmutabledata


    【解决方案1】:

    当您的委托的 connection:didReceiveData: 方法被调用时,您会将连接实例作为第一个参数。因此,您需要使用它来跟踪刚刚接收到数据的连接。

    Apple 的示例维护了一个 NSMutableData 实例。您的代码将需要多个实例,每个活动连接一个。

    当然,您也可以为每个连接设置一个单独的委托对象(一个单独的实例)。那可能更容易。

    【讨论】:

    • 谢谢!它不会像建立一个 connection:didReceiveData1 和 connection:didReceiveData2 方法那么简单,每个 NSUrlConnection 一个方法,因为可能有任意数量的 NSUrlConnections。您将如何维护 NSMutableData 的多个实例?我是否需要创建一个 NSMutableDatas 数组并让每个连接都写入它,或者类似的东西?
    • 另外,我找到了一种方法来使用 NSMutableDictionary 来跟踪哪个 NSUrlConnection 正在结束。在 connectionDidFinishLoading 中,我查找了我制作的字典,以查看哪个连接已完成并相应地更新正确的视图。也许我也可以使用该代码来处理数据...?关于我将如何去做的任何建议?
    • 哦,我想我明白了。我所做的是为 recievedData NSMutableData *receivedData = [[NSMutableData data] retain] 创建另一个 NSMutableDictionary; [dataDictionary setObject:receivedData forKey:[theConnection description]];这样接收到的数据有一个对应的连接,可以通过键[theConnection description]来识别。然后在 didReceiveData 中,我说: NSMutableData *receivedData = [dataDictionary objectForKey:[connection description]]; [接收数据追加数据:数据];等等。这听起来像是一个合理的解决方案吗?
    • 是的,类似的方法会起作用。就个人而言,我通常为每个连接分配一个唯一的轻量级委托对象。然后该委托发布最终结果(通常在主操作队列上),以便我可以根据需要继续处理最终数据或失败。但关键是每个连接都有一个小对象,它负责所有数据的积累,并有自己的 NSMutableData 实例。这有意义吗?
    • 我想是的。我认为一切正常,非常感谢您的帮助。我没有意识到这个网站的 cmets 部分的格式看起来如此糟糕,否则我的最后一个回复会更具可读性。
    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2010-12-24
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多