NSURLSession返回数据

时间:2015-10-26 19:45:39

标签: ios swift nsurlsession

我有问题。我想从互联网上下载图像,并在下载时显示“指示符”。问题是当没有互联网连接时,方法“已下载从”进入“ if error!= nil ”,因此“指标”永远不会中断。这是我的代码。

Chromosome

修改

var imageArray:[String]! = ["http://findicons.com/files/icons/1072/face_avatars/300/a01.png", "http://findicons.com/files/icons/1072/face_avatars/300/a02.png", "http://findicons.com/files/icons/1072/face_avatars/300/a03.png", "http://findicons.com/files/icons/1072/face_avatars/300/a04.png", "http://findicons.com/files/icons/1072/face_avatars/300/a05.png"]   

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let newCell = tableView.dequeueReusableCellWithIdentifier("userCell") as! UserCell_TableViewCell
        let selectedUser = userArray[indexPath.row]

        newCell.userDescription?.text = selectedUser.getFirstName() + " " + selectedUser.getLastName()
            let randomNumber = arc4random_uniform(4)
            let arrayIndex = Int(randomNumber)
            let urlImage = imageArray[arrayIndex]

            newCell.loadIndicator.startAnimating()

            downloadedFrom(urlImage) { userImage in
                dispatch_async(dispatch_get_main_queue()){
                    newCell.userImage.image = userImage
                    newCell.loadIndicator.stopAnimating()
                }

                self.userArray[indexPath.row].setImage(userImage)
            }

        return newCell
    }

    func downloadedFrom(urlLink :String, completionHandler: (UIImage) -> ())
    {
        if let urlData = NSURL(string: urlLink) {
            NSURLSession.sharedSession().dataTaskWithURL(urlData) { (data, response, error) in
                if error != nil {
                    print("error=\(error)")
                    return
                } else {
                    if let httpResponse = response as? NSHTTPURLResponse {
                        let userImage = httpResponse.statusCode == 200 ? UIImage(data: data!) : UIImage(named: "unknownImage")

                        completionHandler(userImage!)
                    }}
                }.resume()
        }
    }

让我这样做的问题是,我需要你下载图像以将其保存到数组中,方法中的数组完整性cellForRowAtIndexPath

1 个答案:

答案 0 :(得分:1)

首先,我想提一下,尝试在表格单元格方法中调度加载循环(即使在单独的线程中)是不好的做法。您正在执行的块将捕获newCell指针,因此如果在将单元格移出表格并重新使用后加载图像,则图像将被加载到错误的表格单元格中。

解决问题的最佳方法是将加载函数移动到单元格的类本身。因此,在配置单元格时,只需提供指向单元格的链接,然后让单元格处理图像加载。

要解决最初的问题,您可以修改加载过程,以便在单元格移出表格时(如果调用prepareForReuse()),取消加载过程。

在单元格的类中,您可以添加对Internet连接的检查,以便在返回错误时停止指示符。当您将功能移动到单元格的类时,这将变得更加清晰。