无法从Parse加载图像 - Swift动态转换失败

时间:2015-03-17 22:56:06

标签: ios swift parse-platform

我正在尝试从View Controller中的Parse中提取用户的图像。但是,每当我运行应用程序时,它都会因此错误崩溃:

libswiftCore.dylib`swift_dynamicCastObjCClassUnconditional:
0x106742620:  pushq  %rbp
0x106742621:  movq   %rsp, %rbp
0x106742624:  pushq  %rbx
0x106742625:  pushq  %rax
0x106742626:  movq   %rsi, %rcx
0x106742629:  movq   %rdi, %rbx
0x10674262c:  xorl   %eax, %eax
0x10674262e:  testq  %rbx, %rbx
0x106742631:  je     0x10674264c               ; swift_dynamicCastObjCClassUnconditional + 44
0x106742633:  movq   0x82756(%rip), %rsi       ; "isKindOfClass:"
0x10674263a:  movq   %rbx, %rdi
0x10674263d:  movq   %rcx, %rdx
0x106742640:  callq  0x1067451ca               ; symbol stub for: objc_msgSend
0x106742645:  testb  %al, %al
0x106742647:  movq   %rbx, %rax
0x10674264a:  je     0x106742653               ; swift_dynamicCastObjCClassUnconditional + 51
0x10674264c:  addq   $0x8, %rsp
0x106742650:  popq   %rbx
0x106742651:  popq   %rbp
0x106742652:  retq   
0x106742653:  leaq   0xcdc8(%rip), %rax        ; "Swift dynamic cast failed"
0x10674265a:  movq   %rax, 0x8ae57(%rip)       ; gCRAnnotations + 8
0x106742661:  int3   
0x106742662:  nopw   %cs:(%rax,%rax)

我知道图像存在且用户属性在Parse中被正确地称为“图像”。用户对象来自前一屏幕的segue。当我注释掉图像代码时,用户名字标签显示正确,因此我知道用户对象有效。

如果我设置应用程序似乎崩溃let userImageFile = user?["image"] as PFFile的断点,我可以用鼠标指针悬停在userImageFile上,并显示“ObjectiveC.NSObject(NSObject)”。一旦我继续通过断点,应用程序就会因上面的错误而崩溃。

以下是相关代码:

import UIKit

class GameViewController: UIViewController {

    @IBOutlet weak var userName: UILabel!

    @IBOutlet weak var timer: UILabel!

    @IBOutlet weak var userImage: UIImageView!

    var user: PFUser?

    override func viewDidLoad() {
        super.viewDidLoad()

        userName.text = user?["first_name"] as String?

        let userImageFile = user?["image"] as PFFile

        userImageFile.getDataInBackgroundWithBlock{
                (imageData: NSData!, error: NSError!) -> Void in
                if error == nil{

                    let image = UIImage(data: imageData)

                    self.userImage.image = image

                } else {

                    println(error)
                }
            }
    }

}

有什么想法吗?我认为它必须与userImageFile是ObjectiveC NSObject有关,但我不知道该怎么做。非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试执行以下操作:

override func viewDidLoad() {
   super.viewDidLoad()

   if let user = user{
      userName.text = user["first_name"] as? String

      if let userImageFile = user["image"] as? PFFile{
         userImageFile.getDataInBackgroundWithBlock { imageData, error in
            if error == nil{
               let image = UIImage(data: imageData)
               self.userImage.image = image
            } else {
               println(error)
            }
         }
      }
   }
}

同样优良的做法是以明确基础类型的方式命名IBOutlet。例如:
userName - > userNameLabel
计时器 - > timerLabel等。
希望这会有所帮助!

答案 1 :(得分:0)

失败的演员似乎表明你没有存储PFFile ......或根本没有存储任何东西...... 您能否在用户中显示存储文件的代码?

您还可以在Parse控制台中查看用户的内容。 添加一个名为" image"的额外列类型为File(PFFile的名字)。 当您点击断点时,刷新控制台并检查'图像的内容。列。