解析Swift - 子类化PFObject - 设置属性导致应用程序挂起而没有错误消息

时间:2016-01-26 22:23:58

标签: ios swift parse-platform subclass

我正在继承一个名为“Item”的Parse对象。以下所有内容均基于Parse文档:https://parse.com/docs/ios/guide#objects-subclasses

我正在尝试从Parse获取对象,只需添加一个名为thumbnailImage的本地属性,类型为UIImage

This is my bridging header:

#ifndef My_Bridging_Header_h
#define My_Bridging_Header_h


#endif /* My_Bridging_Header_h */
#import <Parse/PFObject+Subclass.h>

这是我的“Item.swift”文件:

import UIKit
import Parse


class Item : PFObject, PFSubclassing {

override class func initialize() {
    struct Static {
        static var onceToken : dispatch_once_t = 0;
    }
    dispatch_once(&Static.onceToken) {
        self.registerSubclass()
    }
}


@NSManaged var thumbnailImage: UIImage


static func parseClassName() -> String {
    return "Item"
}
}

最后,在我的viewController中,代码在"hello world"行之后挂起:

        let query = PFQuery(className: "Item")
        query.whereKey("expired", equalTo: false)

        query.findObjectsInBackgroundWithBlock({ (results, error) -> Void in

            if error != nil {
                print(error)
            }

            else {

                self.itemsToDisplay.removeAll()

                print(results!.count)

                self.itemsToDisplay = results as! [Item]

                for item in self.itemsToDisplay {

                    let downloadedItemThumbnailImage = item["thumbnailImage"] as! PFFile

                    do {

                        let downloadedItemThumbnailImageData = try UIImage(data: downloadedItemThumbnailImage.getData())

                        print("hello world")

//the problem line is below

                        item.thumbnailImage = downloadedItemThumbnailImageData!

                        print("now I am here!")

                    }

                    catch {
                        print("error with downloaded image data")
                    }



                }

itemsToDisplay是[Item]的数组,它是我的PFObject子类。

Xcode没有给我任何错误消息,但最终我确实得到了内存警告并且必须退出应用程序。不确定发生了什么。

为什么这不起作用:item.thumbnailImage = downloadedItemThumbnailImageData!

如何在子类PFObject上设置此本地属性?

最后,我在AppDelegate.swift文件的顶部注册了我的子类:

// Parse Register Subclasses Item.registerSubclass()

2 个答案:

答案 0 :(得分:1)

在子类化PFObject时,您不希望将UIImage直接作为属性。相反,把它变成PFFile。这允许您下载文件,然后获取图像数据。

如果你想在同一个类中完成所有操作,你可以下载文件,然后在不使用@NSManaged的情况下设置属性,但是,这可能不会提供任何好处,并将图像保存在内存中只要对象是。

答案 1 :(得分:0)

如果要使用Parse SDK将图像快速用作子类,则可以使用此解决方案。

import Parse

class Person: PFObject, PFSubclassing{
    @NSManaged var name: String
    @NSManaged var age: Int
    @NSManaged var imageFile: PFFileObject!
    class func parseClassName() -> String {
        return "Person"
    }   
}

//By writing this function you can add your data to the server with image data
func addData(){
    let person = Person()
    person.name = "Muhammad ABBAS"
    person.age = 21
    let image = #imageLiteral(resourceName: "IMAGENAME") // Image litral
    // if your image is .jpeg or .jpg then write this 
    person.imageFile = PFFileObject(data: image.jpegData(compressionQuality: 100)!)
    person.saveInBackground { success, error in
        if success{
            print("Successfully Data Upload")
        }else{
            print("Not uploaded the data")
        }
    }
}

如果您的图片是.png,请写下 person.imageFile = PFFileObject(data: image.pngData()!) 代替 person.imageFile = PFFileObject(data: image.jpegData(compressionQuality: 100)!)