我正在尝试从Parse查询图像,我继续遇到fatal error: unexpectedly found nil while unwrapping optional value
。我不确定这是否与最近对Swift和Xcode的更新有关,所以也许它在Parse端,或者肯定是用户错误。
getDataInBackGroundWithBlock
将接受的唯一内容是NSData?
和NSError?
作为选项。如果我尝试展开它们或使用其他类型,它将无法编译。
PFQuery
按预期返回数据。只有在PFFile
电话中尝试从NSData
切换到getDataInBackGroundWithBlock
时才会出现此问题。
该框架已连接并正在运行。我已经测试了很多。
这是调用堆栈:
我现在已经连续工作了12个多小时。我到处都看了,尝试了很多不同的东西。我不认识任何与Swift或Xcode合作的人,你的帮助会走多里路。
以下是我试图无效的其他主题,一个是我自己的:
Unresolvable error with Parse "Get Data In Background With Block"
Parse getDataInBackgroundWithBlock not fetching in order
Swift Image retrieving from Parse sdk - getting crashed
同样解析文档:
https://www.parse.com/docs/ios_guide#files/iOS(他们的例子是我今天的起点)
var photoArray: Array<UIImage> = []
override func viewDidLoad() {
super.viewDidLoad()
callPFObjectQuery()
let testObject = PFObject(className: "QuestionMaster") //testobject
testObject["foo"] = "bar" //testobject
testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
println("Object has been saved.")
}
}
func callPFObjectQuery() {
var finalObjects: [PFObject] = []
var nsdataObjects: NSData?
var query: PFQuery = PFQuery(className: "QuestionMaster")
query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in
for object in objects! {
let imageFiles = object["questionImage"] as! PFFile!
//error line imageFiles.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in
if error == nil {
dispatch_async(dispatch_get_main_queue()) {
let image = UIImage(data: imageData!)
self.photoArray.append(image!)
println(self.photoArray[0])
}
}
}
}
}
}
更新,2015年11月12日 - Swift 1.2:自我发布此消息已经过去了几个月,因为它有超过1k的观看次数和没有upvotes的答案我认为最好回过头来确保我选择的确实是正确的。我还没有经过测试,但已经变得非常非常熟悉(6-8k行)和Parse SDK以及Swift我对我提供的答案感到满意。 Uttam Sinha非常接近,但是在getDataInBackgroundWithBlock
中完成处理程序中的unwrapping而不是可选项将无效。它们必须是选项,然后在块中展开。 Ingouackaz完全错过了for循环,但他的getDataInBackgroundWithBlock
电话是正确的。
我的第一次尝试充其量只是草率,我可能很沮丧。对于那些刚开始的人来说,数据查询之前的查询将以PFObject
的数组完成。因此,您需要遍历该数组,在每个项目上调用getDataInBackgroundWithBlock
。
而不是object["questionImage"]
我可能会选择object.valueForKey("questionImage")
来使其更明确。我还将密钥字符串"questionImage"
作为常量存储在密钥文件中,因此不必担心打字错误。
我不确定PDF文件和Parse。从那以后我没有尝试过。但现在我很好奇,因为如果可能的话,这将再次使我的工作更轻松。我会再次尝试更新。
答案 0 :(得分:2)
这适用于Swift 1.2
file.getDataInBackgroundWithBlock({
(imageData: NSData?, error: NSError?) -> Void in
if (error == nil) {
let image = UIImage(data:imageData!)
println(image)
}
})
答案 1 :(得分:0)
试试这个。它有效 -
query.findObjectsInBackgroundWithBlock ({(objects:[AnyObject]!, error: NSError!) in
if(error == nil){
self.getImageData(objects as [PFObject])
}
else{
println("Error in retrieving \(error)")
}
})//findObjectsInBackgroundWithblock - end
func getImageData(objects: [PFObject]) {
for object in objects {
let thumbNail = object["questionImage"] as PFFile
println(thumbNail)
thumbNail.getDataInBackgroundWithBlock({
(imageData: NSData!, error: NSError!) -> Void in
if (error == nil) {
let image = UIImage(data:imageData)
println(image)
}
})//getDataInBackgroundWithBlock - end
}//for - end
}
答案 2 :(得分:0)
删除&#34;!&#34;在下面一行的末尾:
let imageFiles = object["questionImage"] as! PFFile!
应该是这样的:
let imageFiles = object["questionImage"] as! PFFile
答案 3 :(得分:0)
这很有效。但是,此方法不适用于矢量图像。似乎故事板中的便利功能尚无法通过代码访问。至少不是这样的。
您可以注意到问题是imageFiles.getDataInBackgroundWithBlock
行中的简单白色间距。不得不减去一个空格并添加括号。感谢@ user2770692指出这一点。
func queryImages() {
var query: PFQuery = PFQuery(className: "QuestionMaster")
query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in
for object in objects! {
let imageFiles = object["questionImage"] as! PFFile
println(imageFiles)
imageFiles.getDataInBackgroundWithBlock({
(imageData: NSData?, error: NSError?) -> Void in
if (error == nil) {
let image = UIImage(data:imageData!)
println(image)
}
})
}
}
}