【问题标题】:Receive data in same order as that of NSOperationQueue以与 NSOperationQueue 相同的顺序接收数据
【发布时间】:2011-06-04 03:21:05
【问题描述】:

我有一个 NSOperationQueue,我会在其中不断添加 NSOperation 对象来访问服务器并带来数据。有没有办法按照它们被触发的顺序存储接收到的数据?例如,假设 A、B 和 C 对象以 ABC 的顺序添加到 NSOperationQueue 中。现在 A、B 和 C 三个中的每一个都将在其相应的线程中带来数据。我想将结果以相同的顺序存储在数组中,以便数组的内容变为“结果 A”、“结果 B”和“结果 C”。 请为此问题提供解决方案或正确答案的方向。谢谢各位

已编辑 - 基本上,我想设计一个自动提示组件,它从服务器中获取数据(与谷歌应用程序相同),我认为 NSOperationQueue 是实现这一点的最佳方法。目前我将 maxConcurrentOperationCount 设置为 1,但我想将其设置为大于 1,因为数据来自服务器的速度非常慢。请指出这个问题的正确解决方案或方向。谢谢

【问题讨论】:

    标签: iphone nsoperationqueue


    【解决方案1】:

    如果您一次使用 1 个操作,那么简单的 NSURLConnection 将使用 NSURLRequest 和委托方法来做到这一点。无需使用操作创建操作队列

    更新:如果您想下载单个资源并为此使用并行下载 - 请参阅 this question/answer

    您可以为不同的 NSURLRequests/NSURLConnections 定义相同的主机,并添加额外的“Range”http 标头来定义请求文件的数据范围,而不是使用不同的主机。之后所有操作完成,数据被收集到数组中,只需按请求的范围对数据对象进行排序并将其连接起来。

    【讨论】:

    • 这个答案+1。您可以通过将最大线程数设置为大于 1 来进一步优化,但是一次下载多个文件的效率提高似乎超过了实现它所需的逻辑 + 早期 iOS 版本最多支持 2 个(很可能只有 1 个)
    【解决方案2】:

    在创建每条数据时为它们赋予一个值。您可以将索引传递给您的 NSOperation 类,当您收到响应时,将数据包装在您自己的类中并为其提供索引)

    @class MyData : NSObject {
        NSData *data;
        uint index;
    }
    
    @property (nonatomic, assign) uint index;
    @property (nonatomic, copy) NSData *data;
    

    然后,当您的所有操作都返回时,您应该有一个 MyData 对象数组。只需按索引对它们进行排序以按初始顺序获取它们:) 然后提取数据应该很简单。


    我假设您不想一次只进行一项操作:)

    【讨论】:

    • 感谢您的回复,但我一次使用一个操作。你能提供一个concurrentOperationCount = 1的解决方案吗?谢谢
    【解决方案3】:

    您真的需要所有结果吗?我想如果你正在开发一个自动建议组件,你应该只对最后一个结果感兴趣。如果是这种情况,您可以在添加要处理的最后一个操作之前将“-(void)cancelAllOperations”消息发送到您的 NSOperationQueue。这样,处于等待状态的操作将被取消,正在处理的操作有机会在返回数据之前检查它们的“取消”状态。

    【讨论】:

    • 感谢您的回复。是的,我需要所有结果,并且我希望将结果存储在与将相应请求添加到队列中时相同的顺序,即如果我键入 CAR,则服务器请求按 C、CA、CAR 和 I 的顺序进行想要以相同的顺序将结果存储在数组中,以便 C 的索引 0 处的结果必须存在,CA 的索引 1 处的结果和 CAR 的索引 2 处的结果必须存在。谢谢
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多