Convert String to PFObject.. Parse - ios

I am retrieving all the user details this way..
var userIds = [String]()
var userNames = [String]()
var profilePics = [PFFile]()
var gender = [String]()
override func viewDidLoad() {
super.viewDidLoad()
var userQuery = PFUser.query()
userQuery?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
if let objects = objects {
self.userIds.removeAll(keepCapacity: true)
self.userNames.removeAll(keepCapacity: true)
self.profilePics.removeAll(keepCapacity: true)
for object in objects {
if let user = object as? PFUser {
if user.objectId != PFUser.currentUser()?.objectId {
self.userIds.append(object.objectId as String!)
self.userNames.append(object["fullName"] as! String!)
self.profilePics.append(object["profilePicture"] as! PFFile!)
self.gender.append(object["gender"] as! String!)
}
}
}
}
self.tableView.reloadData()
})
}
now i have "follow" button in myCell.. saving this way..
#IBAction func followButtonTapped(sender: UIButton) {
var followers:PFObject = PFObject(className: "Followers")
followers["user"] = userIds[sender.tag] // Problem is here.. i want "user" column to be filled with userIds of users as Pointers not Strings. What should i do here??
followers["follower"] = PFUser.currentUser()
followers.saveInBackground()
}
Because i want to make relations with every object in "Followers" class that's why i want them to be in the form of Pointers.. Any suggestion please??

If you want to create a pointer to another PFObject (including PFUser) you will need to actually point to that object.
I see in your query that you are not adding any PFUsers to your array, but you are getting their object IDs.
Since a tag is only for an Int, you can not use it to pass a String (which a Parse objectID is).
You can subclass UIButton and create a new property to handle the objectID from parse and then use that to perform a query with the objectID and save the pointer to the result of that query. Or you can just add the object from your first query to your local array and use your button's tag to get the index of the object you want to point to.
Update
Since you have the objectId for the PFuser you want, you can get it and update your followers like so:
let getOjbectByIdQuery = PFQuery(className: "User")
getOjbectByIdQuery.whereKey("objectId", equalTo: userIds[sender.tag])
getOjbectByIdQuery.getFirstObjectInBackgroundWithBlock { (foundObject: PFObject?, error: NSError?) -> Void in
if let object = foundObject {
var followers:PFObject = PFObject(className: "Followers")
followers["user"] = object
followers["follower"] = PFUser.currentUser()
follwers.saveInBackground()
}
}

Related

Retrieve data from first only item in for loop

I have a query that gets objects from the server I'm then reducing the number of objects by matching "packName" to "className" which should just give me the children of "packName".
from this i am populating an array of struct items and pulling out the data for the first index of the array.
this is fine but I'm just a bit concerned that if the number of children increases this may slow processing down. so i was wondering if there was a way to just retrieve the first item of the for loop, which is all I'm after as the query has been sorted in ascending order.
this is the function code below.
class func createHistory(packName: String, completeBlock: ((Bool) -> Void)? = nil) {
struct initialDataStruct {
var packNameStruct : String
var packIdStruct : String
var partNameStruct : String
var partIdStruct : String
var partIndexStruct : Int
}
var initialDataArray = [initialDataStruct]()
let historyClass = PFObject(className: packName)
let query = PFQuery(className: "Part")
query.includeKey("fromPack")
query.order(byAscending: "partName")
query.fromLocalDatastore()
query.findObjectsInBackground { (objects, error) in
if error != nil {
print(error!)
}
else if let parts = objects {
for object in parts {
// if the fromPack column has data
if let fromPack = object.object(forKey: "fromPack") as? PFObject {
// create the class name from the pack name
if let className = (fromPack.object(forKey: "packName") as? String) {
// packName was sent from JVC
// this will limit array items to how ever many children packName has
if packName == className {
// because its sorted could probably just get the first item here
let packName = fromPack.object(forKey: "packName") as! String
let packId = fromPack.objectId as String!
let partName = object.object(forKey: "partName") as! String
let partId = object.objectId as String!
let partIndex = 0
initialDataArray.append(initialDataStruct(packNameStruct: packName,
packIdStruct: packId!,
partNameStruct: partName,
partIdStruct: partId!,
partIndexStruct: partIndex))
}
}
}
} // for
historyClass.add(initialDataArray[0].packNameStruct, forKey: "packName")
historyClass.add(initialDataArray[0].partIdStruct, forKey: "packId")
historyClass.add(initialDataArray[0].partNameStruct, forKey: "partName")
historyClass.add(initialDataArray[0].partIndexStruct, forKey: "partIndex")
print(historyClass)
PFObject.pinAll(inBackground: [historyClass])
}
} // query
}

Appending into an array from completion block

I am attempting to append the results of the parse query into usersData
struct Data {
var FirstName:String!
var LastName:String!
var Gender:String!
var Age:String!
}
In the class I have
var usersData = [Data]()
I am using this to
func parseUsersData(completionHandler: [Data] -> Void) {
var usersDataArray = [Data]()
let query = PFQuery(className: "_User")
query.fromLocalDatastore()
query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if error == nil {
if let user = objects as? [PFObject]! {
for object in user! {
var singleData = Data()
singleData.FirstName = object["firstName"] as! String
singleData.LastName = object["lastName"] as! String
singleData.Gender = object["gender"] as! String
singleData.Age = object["age"] as! String
usersDataArray.append(singleData)
}
}
completionHandler(usersDataArray)
}
}
}
finally, I am trying to do this:
Edit: To clarify, I need to pass the data from the queries, userDataArray, into the array usersData.
parseUsersData { (usersDataArray) -> Void in
usersData.append(usersDataArray)
}
The error I am getting is
Cannot convert value of type '[Data]' to expected argument type 'Data'
In your last code block you seem to appending a Data array to a Data object usersData.append(usersDataArray) which causes error I think. Did you mean to write usersDataArray.append(usersData) which makes a lot more sense?
You are attempting to add an array of Data to an array that is looking for Data Objects. Add a new struct that handles your Data Array and then change the usersData to look for DataArray's:
struct DataArray {
var array = [Data]()
}
And change the line:
var usersData = [DataArray]()
usersDataArray is an array. To add an array to an other array, prefer appendContentsOf :
usersData.appendContentsOf(usersDataArray)

how to retrive data from a user pointer on Parse using swift

On Parse I have users with Facebook profile and Email login profile. So I want to bury for users data in my twitter-like app.
In my "messages" class on Parse I have column "sender" that contains pointers to parse users.
I just want to retrive and show the name of users in class "messages" contained in the column "sender" wich contains pointers to PFUsers of which I need data for keys
"first_name"
"last_name"
"profile_picture"
How can I retrive their data like name and image in order to show them in a tableview?
these are the declarations of my arrays:
var sendersArray : [String] = []
var picturesArray : [NSData] = []
maybe I could use something like this tuple, but I can't understand how to grab data from pointers
for user in list {
let firstName = "fist_name"
let lastName = "last_name"
let oProfileImage = NSData() //"image_profile" as! NSData
otherUsers.append((oName: firstName, oLastName: lastName, oImageProfle: oProfileImage))
}
version - 1:
I started with printing the whole pf object
//******************************************************
func theSearch() {
let theSearchQuery = PFQuery(className: "Messages")
theSearchQuery.findObjectsInBackgroundWithBlock({
(objects : [AnyObject]?, error : NSError?) -> Void in
for object in objects! {
let theName = object.sender!
print(object)
print(theName)
sendersArray.append(theName)
let profilePicture = object["profile_pic"] as! PFFile
picturesArray.append(profilePicture)
}
self.tableView.reloadData()
})
}
//*******************************************************
version - 2:
then, found this solution, but still, doesn't
func theSearch() {
let theSearchQuery = PFQuery(className: "Messages" )
theSearchQuery.includeKey("sender")
theSearchQuery.findObjectsInBackgroundWithBlock({
(objects : [AnyObject]?, error : NSError?) -> Void in
for object in objects! {
let theName = object.sender!["first_name"] as? String
print(object)
print(theName)
sendersArray.append(theName)
let profilePicture = object["profile_pic"] as! PFFile
picturesArray.append(profilePicture)
}
self.tableView.reloadData()
})
}
errors:
seems to be a problem with sender, maybe I shouldn't use it
thanks in advance
let theName = object.objectForKey("sender")!.objectForKey("first_name") as! String
Complete Code:
func theSearch() {
let theSearchQuery = PFQuery(className: "Messages")
theSearchQuery.includeKey("sender")
theSearchQuery.findObjectsInBackgroundWithBlock({
(objects : [AnyObject]?, error : NSError?) -> Void in
for object in objects! {
let theName = object.objectForKey("sender")!.objectForKey("first_name") as! String
print(object)
print(theName)
self.sendersArray.append(theName)
let profilePicture = object["profile_picture"] as! PFFile
self.picturesArray.append(profilePicture)
}
self.tableView.reloadData()
})
}
Also, your picturesArray should be of type PFFile, like this:
var picturesArray = [PFFile]()
NOT NSData. change that at the top of your class.
-----EDIT------:
If you want to retrieve an image from a parse query, do this:
1) at the top of your class, declare the following arrays to store the results:
// your images will be stored in the file array
var fileArray = [PFFile]()
// your first and last names will be stored in String Arrays:
var firstNameArray = [String]()
var lastNameArray = [String]()
2) perform the query:
let query1 = PFQuery(className: "_User")
query1.orderByDescending("createdAt")
query1.findObjectsInBackgroundWithBlock({
(objects : [AnyObject]?, error : NSError?) -> Void in
if error == nil {
for x in objects! {
let firstName = x.objectForKey("first_name") as! String
let lastName = x.objectForKey("last_name") as! String
self.firstNameArray.append(firstName)
self.lastNameArray.append(lastName)
if x.objectForKey("profile_picture") as? PFFile == nil {
print("do nothing cause it's nil")
}
else {
let file:PFFile = x.objectForKey("profile_image") as! PFFile
self.fileArray.append(file)
}
}
self.tableView.reloadData()
}
})
Note I am using Swift 2 and Xcode 7. Syntax is slightly different in Xcode 6.4 and Swift 1.2.

Query on PFUser according to key value (Swift)

I have PFUser saved as a pointer in this class. I'd like to retrieve the user's first name and corresponding "point value"
My attempt below to append that data to it's cell value, but it is only returning the last retrieved object for that key value.
var innerQuery : PFQuery = PFUser.query()!
innerQuery.whereKeyExists("objectId")
let query = PFQuery(className: "myClass")
query.whereKey("userId", matchesQuery: innerQuery)
query.whereKey("points", greaterThan: 1000)
query.findObjectsInBackgroundWithBlock{ (objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
if let objects = query.findObjects() as? [PFObject]{
for object in objects {
if let listPoints = object.objectForKey("points") as? Int {
var temp = String(listPoints)
cell.pointStatus.text = temp
}
}
}
}
else{
println(error?.description)
}
}
I retrieve the users first name and profile picture in a separate call. Everything is functional aside from the query for points.
if let pfuser = userProfile["first_name"] as? String{
if let pfimage = userProfile["profile_picture"] as? PFFile{
pfimage.getDataInBackgroundWithBlock({
(result, error) in
cell.userIcon.image = UIImage(data: result!)
cell.userName.text = username
})
}
}
It appears that you are only writing the value of listPoints to one cell in
var temp = String(listPoints)
cell.pointStatus.text = temp
If you want to have multiple point values to be displayed, the cell reference will need to be changed.

Get data from a pointer's row in Parse (ios)

I have a pointer named "Parent" in my class, "ComparablePhotos", which points to another class, "NewLog". I am trying to get the data (Address, ObjectId, Lat) from the row in NewLog that Parent points to. How do I do this using query1.includeKey provided?
Code:
var query1 = PFQuery(className: "ComparablePhotos")
query1.includeKey("Parent")
//get NewLog[address], NewLog[lat], and NewLog[objectId] using "Parent" pointer
ComparablePhotos class:
NewLog class:
see if this helps you out at all...you probably will have to change some of the objects to exactly fit your words from the parse database.hopefully that will steer you in the right direction
var query1 = PFQuery(className:"NewLog")
query1.includeKey("Parent")
query1.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let objects = objects {
for object in objects {
var address = object["address"] as! String
var lat = object["lat"] as! String
var objectId = object["objectId"] as! String
this is how i query a role, which is similar to a pointer query...
var roleQuery = PFRole.query()
roleQuery!.whereKey("name", equalTo: "admin")
roleQuery!.getFirstObjectInBackgroundWithBlock() { (roleObject: PFObject?, error) -> Void in
var adminRole = roleObject as! PFRole
adminRole.users.query()!.findObjectsInBackgroundWithBlock({ (users, error:NSError?) -> Void in
if error == nil {
if let adminUsers = (users as? [PFUser]) {

Resources