我在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
提前非常感谢你。
答案 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
}