UICollection查看异步图像加载+重新加载

时间:2015-09-29 03:28:54

标签: ios json swift asynchronous loading

我遇到以下问题:

我有一个带UICollection View的视图控制器,文本数据(名称,图像的url)来自json使用swiftyJSON,但所有图像都以异步方式下载:

`func loadImageForCell(url:String,imageView:UIImageView){

    let downloadQueue = dispatch_queue_create("io.test.downloadimage", nil)

    dispatch_async(downloadQueue){

        var data = NSData(contentsOfURL: NSURL(string: url)!)

        var image: UIImage?

        if (data != nil){

            image = UIImage(data: data!)!

        }



        dispatch_async(dispatch_get_main_queue()){

            imageView.image = image


        }


    }


}

`

我还有这样的要求:通过在选择器中选择一个值,必须发送另一个json请求,并且应该根据接收的信息更新(重新加载)集合视图。

当我添加collectionView.reloadData()时,它适用于文本数据,但图像正在混合。所有单元格都包含错误图像

选择项目选择器时执行此功能:

func updateLabel(){



    var sizeComponent = PickerComponent.size.rawValue

    var chosenCategory = pickerData[sizeComponent][myPicker.selectedRowInComponent(sizeComponent)]
  [myPicker.selectedRowInComponent(toppingComponent)]
    CategoryLabel.setTitle(chosenCategory, forState: .Normal)

    ArrayOfDescSmall = []
    ArrayOfURLs = []

    let url = NSURL(string: "***")
    var request = NSURLRequest(URL: url!)
    var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)

    var hoge = JSON(data: data!)

    let sampleJson = hoge.array

        if(sampleJson == nil){

            TotalNumber = 0

        } else{

    TotalNumber = sampleJson!.count   

        }

   for(var i = 0; i < TotalNumber; i++){

        ArrayOfDescSmall.append(hoge[i]["name"].string!)
        ArrayOfURLs.append(hoge[i]["imageUrl"].string!)
    }

        CollectionView.setContentOffset(CGPoint(x: 0, y: -60), animated:true)
    }



}

如何解决?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的单元格显示错误图像的原因是因为单元格在集合视图中重复使用,并且看起来在重复使用单元格时不会取消数据请求。虽然很容易修复。 向自定义单元格类添加两个属性:

@property(strong, nonatomic) NSURSessionDataTask *imageDataTask;
@property(strong, nonatomic) NSURL *imageUrl;

为网址添加自定义setter,如下所示:

- (void)setImageUrl:(NSURL *)imageUrl {
  _imageUrl = imageUrl;
  self.imageDataTask = 'new nsurlsessiondatatask for your image, 
        with a completion handler where you convert data into an image, 
        and set image to the imageView on the main thread'
  [self.imageDataTask resume];
}

实施“prepareForReuse”方法,并在那里取消您的数据任务,如下所示:

- (void)prepareForReuse {
  [super prepareForReuse];
  [self.imageDataTask cancel];
}

现在,当您将新的imageUrl设置为单元格时,它将自动开始下载,然后在下载完成时显示图像。