微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

异步下载UITableView时出现问题

如何解决异步下载UITableView时出现问题

|| 我正在尝试异步下载UITableViewCell的图像,但是当前它正在为每个单元格设置相同的图像。 请您告诉我代码的问题:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static Nsstring *CellIdentifier = @\"Cell\";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    SearchObject *so = (SearchObject *)[_tableData objectAtIndex:indexPath.row];
    cell.textLabel.text = [[[[so tweet] stringByReplacingOccurrencesOfString:@\"&quot;\" withString:@\"\\\"\"] stringByReplacingOccurrencesOfString:@\"&lt;\" withString:@\"<\"] stringByReplacingOccurrencesOfString:@\"&gt;\" withString:@\">\"];
    cell.detailTextLabel.text = [so fromUser];
    if (cell.imageView.image == nil) {
        NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:[so userProfileImageURL]]];
        NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];
        [conn start];
    }
    if ([_cellImages count] > indexPath.row) {
        cell.imageView.image = [UIImage imageWithData:[_cellImages objectAtIndex:indexPath.row]];
    }
    return cell;
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_cellData appendData:data];
    [_cellImages addobject:_cellData];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self.tableView reloadData];
}
    

解决方法

您会将每个下载图像的数据附加到同一数据对象。因此,在最佳情况下,数据对象最终以图像#1的数据结尾,紧接着是图像#2的数据,依此类推;图像解码器显然正在获取数据块中的第一个图像,而忽略了之后的垃圾。您似乎还没有意识到NSURLConnections的
connection:didReceiveData:
不一定会按照连接启动的顺序被调用,
connection:didReceiveData:
每次连接可被调用零次或多次(并且如果您的图像超过几千字节,则可能会被调用) ,并且不能保证依次对表中的每个单元格调用
tableView:cellForRowAtIndexPath:
。所有这些都将完全破坏您的
_cellImages
阵列。 为此,您需要为每个连接拥有一个单独的NSMutableData实例,并且需要将其仅一次添加到
_cellImages
数组中,并以该行的正确索引添加,而不是将其添加到任意的下一个可用索引。然后在ѭ1中,您需要找出要附加到的正确NSMutableData实例;可以通过使用连接对象(使用
valueWithNonretainedObject:
包装在NSValue中)作为NSMutableDictionary中的键,或使用
objc_setAssociatedObject
将数据对象附加到连接对象来完成,或者通过使自己成为一个类来处理所有NSURLConnection为您服务,并在完成时将您交给数据对象。     ,我不知道这是否是导致问题的原因,但是在您的
connection:didReceiveData:
方法中,您只是将图像数据附加到数组中;您应该以一种可以将其链接到应该显示在其上的单元格的方式来存储图像数据。一种方法是使用填充有一堆
[NSNull]
NSMutableArray
,然后替换
null
连接完成加载后,在适当的索引处的值。 另外,当连接尚未完成加载时,您要将
_cellData
附加到
_cellImages
数组中,因此只能在
connection:didFinishLoading
方法中执行此操作。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。