2

在我的应用程序中,我试图能够从我的服务器下载两个对象,一个“文章”和一个图像。'article'-object(从 sql-query 转换为 NSObject 的子类)有一个指向下载图像的位置的指针,这显然比 article-query 需要更长的下载时间。当我“下载”文章时,它们最终以NSArray. 当它们完成后,我将遍历数组以开始异步下载每个图像,有点像这样:

for(Article *a in articles)
{
    NSString *url = a.imageURL;
    //Start async download of this image
}

我正在使用 Parse Framework 来执行此操作,因此该块对于没有使用它的人来说可能看起来很奇怪,所以我将改为解释:在该块中(当异步下载完成时),我正在分配将 NSData(图像)返回到另一个数组,NSMutableArray命名为articleImages,我希望该数组中图像的索引与另一个中文章的索引相对应;两个数组中的年表相同。

现在,我正在这样做:([articleImages insertObject:data atIndex:i];其中i来自 for 循环,而不是像上面那样真正使用 foreach),因为该块仍在同一个 for 循环内。这目前有效,但到目前为止我只测试了三篇文章。如果我在这里没有完全错,那么这是一种糟糕且有缺陷的方法,因为 image2 的下载速度比 image1 快,即使它是稍后启动的。在这些情况下,我想我会偶然发现一个异常,说我不能index:2在空数组中插入对象。

我正在考虑用虚拟数据填充数组,大小为[articles count],然后i用下载的图像替换正确索引( )虚拟数据,因为它们以随机顺序出现。但我一想到这个就觉得很脏。必须有适当的方法来做到这一点?我也不完全确定要搜索什么..

4

2 回答 2

5

另一个想法:制作articleImages一个NSMutableDictionary并使用图像索引(或一些唯一的文章ID)作为键:

articleImages[@(index)] = imageData;
于 2013-07-30T19:11:31.993 回答
1

您需要先放置一些虚拟数据,然后再替换它。我认为没有其他方法可以做到这一点。

我之前有过类似的情况,我做了类似的事情:

- (void)initiateArray:(int)count
{
   _myArray = [[NSMutableArray aloc] init];
   for (int loop = 0; loop < count; loop++)
   {
      [_myArray addObject:[NSNull null]];
   }
}

后来我用以下方法替换了对象:

[_myArray replaceObjectAtIndex:index withObject:newObject];
于 2013-07-30T19:08:24.593 回答