AJ McCaw AJ McCaw - 1 year ago 45
Swift Question

Trying to save user info to parse alternative Syncano with swift

I'm super stuck on this because the Syncano docs aren't great at explaining...
I'm building a simple chat app with Syncano backend (R.I.P Parse) and all I want to do is save the First Name, Last Name, and a unique username which they can pick. I have managed to connect the user to the server already and can see them in my list of classes, but the additional info for the user doesn't show. I have a view controller called

Signup View Controller
which handles all the interaction with the labels and button all connected. It is worth mentioning this is my first app and I am a beginner in programming, so I need someone with a little bit experience to give me a few pointers on which its not saving the users Name and unique username.

This is the how I want to send the data to Syncano when pressed:

class SignupViewController: UIViewController {

var delegate : LoginDelegate?
var @IBAction func signupPressed(sender: AnyObject) {
var huddleusernameText = usernameTextField.text
var firstNameText = firstNameTextField.text
var lastNameText = lastNameTextField.text
var passwordText = passwordTextField.text
var repeatPasswordText = repeatPasswordTextField.text
var emailText = emailTextField.text

func registerUser(username: String, password: String, first_name: String, last_name: String, email: String)
{
SCUser.registerWithUsername(username, password: password)
{ error in
//handle user registration
if (error != nil)
{
//handle error
print("Sign Up, error: \(error)")
}
}
}

self.signUp(self.getUsername()!, password: self.getPassword()!, finished:
{ error in
if (error != nil) {
//handle error
print("Sign Up, error: \(error)")
} else
{
SCUser.currentUser()
self.addNewUser()
self.delegate?.didSignUp()

}
})

func signUp(username: String, password: String, finished: (NSError!) -> ()) {
SCUser.registerWithUsername(username, password: password) { error in
finished(error)
}
}

// Syncano docs mentions using this, but I'm not sure how to use this piece of code to store user data...
class MyUserProfile : SCUserProfile {
var avatar : SCFile? = nil;
var first_name = ""
var last_name = ""
var email = ""
var username = ""
}


This is something additional

func addNewUser() {
let user = MyUserProfile()
user.first_name = firstNameTextField.text!
user.last_name = lastNameTextField.text!
user.email = emailTextField.text!
user.huddle_username = usernameTextField.text!
user.saveWithCompletionBlock { error in
//Handle error
}
}


I will update this question if I run into any new solutions but for now, this is it.

Answer Source

You can find more details in the docs: http://docs.syncano.io/docs/ios#section-subclassing-user-and-user-profile, which talks about your own subclass of user profile to use custom fields (like first name and last name).

I know you already have your own custom user profile, but I feel it will be better if I explain it from the beginning.

First, you need to edit user_profile class, easiest would be through the Dashboard and add there first_name and last_name properties.

Next, create your own custom user_profile class:

import syncano_ios

class MyUserProfile: SCUserProfile {
    var first_name = ""
    var last_name = ""
}

Before you can use it, register it somewhere in your app (e.g. in viewDidLoad of your main class, or even in AppDelegate, in func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool method) using:

SCUser.registerClassWithProfileClass(MyUserProfile.self)

You can now write your code that will save first and last name into user profile:

func saveName() {
    guard let profile = SCUser.currentUser().profile as? MyUserProfile else {
        return
    }
    profile.first_name = "Firstname" //get it from e.g. text field
    profile.last_name = "Lastname" //get it from e.g. text field
    profile.saveWithCompletionBlock { error in
    }
}

Now, modify your code. Instead of calling addNewUser, call saveName method:

self.signUp(self.getUsername()!, password: self.getPassword()!, finished:
        { error in
    if (error != nil) {
                //handle error
                print("Sign Up, error: \(error)")
    } else
    {
        self.saveName()
        self.delegate?.didSignUp()

    }
})

The main difference between this code and the one you posted, is that you were trying to create a new user_profile object - that is impossible to do. Instead, Syncano add a new user_profile every time a new user is created. So what you need to do, is just take the user_profile of the new user, and modify it with by adding first and last name.