转换类型时应用程序崩溃 - Swift

时间:2015-03-25 21:34:28

标签: ios uitableview swift types parse-platform

我在swift中的应用程序有时会构建并完美运行,有时会崩溃。它会在3次中崩溃2次。我正在从Parse中提取数字,我将其放入声明为NSInteger的数组中,因为数据正在转换为NSInteger。我已经尝试过将数组转换为Int / NSInteger,以及我所引入的数据。然后我将数据发布到一个标签中,该标签分为单元格,必须转换为字符串......

由于不同的图片和不同的数据进入单元格,我创建了另一个名为" cells"的类,如下所示,我的UI被连接起来:2个标签和图像。 cell是一个UITableView。

如上所述,有时它会崩溃,有时它不会......我从3个不同的类中提取数据。这可能是个问题吗?

分别从viewDidLoad查询数据。

我已经评论了以下几行,看看问题是否为1,但它们都存在问题。

以下是我用Parse数据填充的变量:

       var hotScores = [NSInteger]() 
       var totalHotScores = [NSInteger]()
       var images = [UIImage]()
        var imageFiles = [PFFile]()

这是崩溃的代码:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var myCell:cells =    self.tableView.dequeueReusableCellWithIdentifier("myCell") as cells

    myCell.hotScore.text = String(hotScores[indexPath.row] as NSInteger)
    myCell.totalScore.text = String(totalHotScores[indexPath.row] as NSInteger)
    imageFiles[indexPath.row].getDataInBackgroundWithBlock{
        (imageData: NSData!, error: NSError!) -> Void in
        if error == nil {

            let image = UIImage(data: imageData)

            myCell.postedImage.image = image
        }


    }
    return myCell
}

以下是我在viewDidLoad中查询它的方法:

    var hotQuery = PFQuery(className:"Hots")
    hotQuery.limit = 10
    hotQuery.orderByDescending("numOfHots")
    hotQuery.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {

            for object in objects {


                self.hotScores.append(object["numOfHots"] as NSInteger)


                self.tableView.reloadData()

            }

    } else {

        println(error)
    }
    }

    var imageQuery = PFQuery(className:"Images")
    imageQuery.limit = 10
    imageQuery.orderByAscending("ImageFiles")
    imageQuery.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {

            for object in objects {

            self.imageFiles.append(object["ImageFiles"] as PFFile)


                self.tableView.reloadData()

            }

        } else {

            println(error)
        }
    }


    var totalVotesQuery = PFQuery(className:"TotalVotes")
    totalVotesQuery.limit = 10
    totalVotesQuery.orderByDescending("numOfTotalVotes")
    totalVotesQuery.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {

            for object in objects {

                self.totalHotScores.append(object["numOfTotalVotes"] as NSInteger)
                self.tableView.reloadData()

            }
        } else {
         println(error)
        }
    }

这就是错误所说的:

  Thread 1: EXC_Bad_INSTRUCTION(CODE=EXC_1386_INVOP,SUBCDE=0X0)

最后,UI元素命名为:

            hotScore //as the first label
            totalScore // as the 2nd label
            postedImage // as the UIImage

提前非常感谢你。

1 个答案:

答案 0 :(得分:1)

请注意,这个单元格可能在图像加载时被重复使用,异步代码的乐趣是一个多行程:)

您应该检查单元格是否仍然需要您返回的图像。您可以尝试检查imageFiles[indexPath.row]并阅读它的网址属性,并将其与您网上的本地对象的网址进行比较。然后只设置图像,如果它们仍然匹配。

无论如何,对于你的崩溃问题,我还不确切知道你正在崩溃的线路,但我肯定会在那里添加一些Optionals安全检查代码,特别是这些线路:

if let image = UIImage(data: imageData) {
  myCell.postedImage?.image = image
}

我不知道postedImage是否可选,所以我添加了"?"以防万一。绝对可以使用if let

从您的评论中可以看出这一行是问题所在:

myCell.hotScore.text = String(hotScores[indexPath.row] as NSInteger)

在这种情况下,它可能意味着hotScores[indexPath.row]在该行中没有与NSInteger兼容的任何内容。再次安全的救援方案:

if let hotScore = hotScores[indexPath.row] as? NSInteger {
  // safely got the hot score, use it
} else {
  // handle the issue of hotScore being invalid for this row
}