以与NSOperationQueue相同的顺序接收数据

时间:2011-01-05 16:30:09

标签: iphone nsoperationqueue

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

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

3 个答案:

答案 0 :(得分:3)

如果您一次使用1个操作,那么简单NSURLConnection将使用NSURLRequest和委托方法执行此操作。无需使用操作

创建操作队列

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

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

答案 1 :(得分:1)

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

@class MyData : NSObject {
    NSData *data;
    uint index;
}

@property (nonatomic, assign) uint index;
@property (nonatomic, copy) NSData *data;

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


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

答案 2 :(得分:1)

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