makingbreaking
makingbreaking

Reputation: 3

PFObject subclassing and pointers

I have a class UserFeed where I store all the posts. And I have a class UserProfile where I store all the user details(name, age, occupation). Currently I have a pointer to UserProfile. But when I try to set the occupationLabel it gives me nil.

//  PostsCollectionViewCell.swift


import UIKit
import DateTools
import Parse

class PostsCollectionViewCell: UICollectionViewCell {

    var post: Post! {
        didSet {
            updateUI()
        }
    }

    @IBOutlet var postLabel: UILabel!
    @IBOutlet var genderLabel: UILabel!
    @IBOutlet var occupationLabel: UILabel!
    @IBOutlet var timeLabel: UILabel!
    @IBOutlet var likeButton: UIButton!

    func layoutSubview() {
        super.layoutSubviews()
    }

    private func updateUI() {

        occupationLabel?.text! = post.userProfile.occupation
        timeLabel?.text! = post.createdAt?.shortTimeAgoSinceDate(NSDate()) ?? ""
        postLabel?.text! = post.postText
    }


    @IBAction func likeButtonDidTouch(sender: AnyObject) {

    }

}

Post query in my DiscoverViewController

func queryForPosts() {

    PFGeoPoint.geoPointForCurrentLocationInBackground { (geopoint, error) in

        if !(error != nil) {

            if let geoPoint = geopoint {

                let query = PFQuery(className: "UserFeed")
                query.whereKey("location", nearGeoPoint: geoPoint, withinMiles: 5)
                query.addDescendingOrder("createdAt")
                query.includeKey("userProfile")

                query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
                    if error == nil {
                        if let postObjects = objects as? [PFObject] {
                            self.posts.removeAll()
                            for postObject in postObjects {
                                let post = postObject as! Post
                                self.posts.append(post)
                            }

                            self.collectionView.reloadData()
                        }
                    } else {
                        print("\(error!.localizedDescription)")
                    }
                })
            }
        }
    }
}

Post subclassing

import UIKit
import Parse

public class Post: PFObject, PFSubclassing{

    // MARK: - Public API
    @NSManaged public var username: PFUser
    @NSManaged public var location: PFGeoPoint?
    @NSManaged public var userProfile: String!
    @NSManaged public var postText: String!
    @NSManaged public var numberOfLikes: Int
    @NSManaged public var likedUserIdCollection: [String]!


    public func incrementNumberOfLikes() {

        numberOfLikes++
        self.saveInBackground()

    }

    //Mark: - Convience init

    init(username: PFUser, location: PFGeoPoint?, userProfile: String, postText: String, numberOfLikes: Int) {

        super.init()

        self.username = username
        self.location = location
        self.userProfile = userProfile
        self.postText = postText
        self.numberOfLikes = numberOfLikes
        self.likedUserIdCollection = [String]()

    }

    override init() {
        super.init()
    }

    //MARK: - Like / Dislike
    public func like(){

        let currentUserObjectId = PFUser.currentUser()!.objectId!
        if !likedUserIdCollection.contains(currentUserObjectId) {
            numberOfLikes++
            likedUserIdCollection.insert(currentUserObjectId, atIndex: 0)
            self.saveInBackground()
        }

    }

    public func dislike() {

        let currentUserObjectId = PFUser.currentUser()!.objectId!
        if likedUserIdCollection.contains(currentUserObjectId) {
         numberOfLikes--
            for (index, userId) in likedUserIdCollection.enumerate() {
                if userId == currentUserObjectId {
                    likedUserIdCollection.removeAtIndex(index)
                    break
                }
            }

            self.saveInBackground()

        }

    }

    // MARK: - PFSubClassing
    override public class func initialize() {

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

    public static func parseClassName() -> String {

        return "UserFeed"

    }
}

Upvotes: 0

Views: 99

Answers (2)

Manoj Kumar Maurya
Manoj Kumar Maurya

Reputation: 76

Object can't store value until it intialize, need to call below init as present in your code

init(username: PFUser, location: PFGeoPoint?, userProfile: String, postText: String, numberOfLikes: Int) {

    super.init()

    self.username = username
    self.location = location
    self.userProfile = userProfile
    self.postText = postText
    self.numberOfLikes = numberOfLikes
    self.likedUserIdCollection = [String]()

}

Upvotes: 4

Manoj Kumar Maurya
Manoj Kumar Maurya

Reputation: 76

Need to initialize Post object, seems you have not made it.

Upvotes: 2

Related Questions