boolean not recorded in NSUserDefaults - iphone

I have an apps that load a json from a remote server, using a NSURLConnection. Once it has finished loading (calling connectionDidFinishLoading), I want to record if it was the first launch of the application.
So in connectionDidFinishLoading I did that :
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL firstLaunch = [defaults boolForKey:#"screen_firstLaunch"];
NSLog(#"First launch : %d",firstLaunch);
[defaults setBool:YES forKey:#"screen_firstLaunch"];
And it displays "First launch : 0" every time ....
So I thought it might be because it's on another thread, so I try to deport the code into a function that I call in connectionDidFinishLoading using performSelectorOnMainThread, but I get the same result ...
Please someone help me, I'm going mad !

Remember to call [defaults synchronize]; after setting your key in the defaults.

Related

NSUserDefaults returns before it has been set

Im making an app that takes two strings and an int. I want these to be displayed on another view.
I have put them into an array and Im trying to store them in the NSUserDefaults. I have managed to get this data stored. The problem that im having is that when I change the data and save it again The function that gets the array is called before the one that sets it . So the application always displays the previous data.
I thought It would be easy to fix by changing when the functions are called.
but from the code it looks to me lie they are in the right order.
2012-09-26 13:55:02.764 BeerDivider[4377:907] array returnd = (
2,
"Person 1",
"Person 2"
)
2012-09-26 13:55:02.773 BeerDivider[4377:907] array saved = (
5,
"Person 1",
"Person 2"
)
I can see from logging the array that they are called in the wrong order.
Please can anyone see where im going wrong. This is my first objective-c/xcode post so not sure what code you want to see. I will put in all of it.
http://pastebin.com/BX5gqp17
Sorry if this is a lot of code.
Thanks for the help.
EDIT: update the code
EDIT2: I think what is happening is similar to this iOS do the button's action before prepareSegue
First Take a look on Apple documentation of NSUserDefault
NSUserDefault always return the data which you saved in it
Dont forgot to write [defaults synchronize];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:yourArray forKey:#"YourKey"]
[defaults synchronize];
According to your given code.
-(void)saveInfo:(NSArray *)myArray
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myArray forKey:#"array"];
[defaults synchronize];
NSLog (#"array saved = %#", [defaults objectForKey:#"array"]);
}
and now check result
Do this:
-(void)saveInfo:(NSArray *)myArray
{
[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:#"array"];
[[NSUserDefaults standardUserDefaults] synchronize]; //u forgot this
NSLog (#"array saved = %#", myArray);
}

XCode Cache Tutorial

Hey, I am trying to cache info on my IPhone App, but don't even know where to get started, I would to just cache a string (ex: 123123-12313123-1231231-123123), so when the user comes back it will remember it.
Is there a tutorial I can follow some where or could someone provide me some code?
Thanks
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setString:#"123123123" forKey:#"myKey"];
[userDefaults synchronize];
Later, when you wish to retrieve this object:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *myString = [userDefaults stringForKey:#"myKey"];
You'll, of course, want to manage the keys properly, etc.

Cannot set NSUserDefaults field

I have the following code in my initialization (first time) of my app:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uid=#"1";
[defaults setObject:uid forKey:#"init_val"];
[defaults synchronize];
Much later in the code (in response to a button press) I check the value using:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *initVal=[defaults objectForKey:#"init_val"];
initVal is always nil. I have checked and init_val is set up exactly the same in my settings bundle as another field that I can set and read from without issue (they are both set up with a single field named "Key".
#mlewis54:
You can try this code. I am very sure that it will work for you.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uid=#"1";
[defaults setObject:uid forKey:#"init_val"];
[defaults synchronize];
For Retrieving Data You Should Use The Following Code :
NSString *initVal=[[NSUserDefaults standardUserDefaults] valueForKey:#"init_val"];
OR
NSString *initVal=[[NSUserDefaults standardUserDefaults] objectForKey:#"init_val"];
EDIT:
If still it gives nil, then you can use the following code:
NSString *initVal=[NSString stringWithFormat:#"%#",[[NSUserDefaults standardUserDefaults] valueForKey:#"init_val"]];
OR
NSString *initVal=[NSString stringWithFormat:#"%#",[[NSUserDefaults standardUserDefaults] objectForKey:#"init_val"]];
Hope this helps you.
Decelare this at an event on click of button ...
NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults];
[savedData setObject:userEmailTextField.text forKey:#"userid"];
and on load load the data and check the value you have entered is showing or not...
userEmailTextField.text =[[NSUserDefaults standardUserDefaults]objectForKey:#"userid"];
You need to use the line
NSString *initVal = [defaults stringForKey:#"init_val"];
- since it's a String you must use stringForKey. You can similarly use boolForKey to get a boolean value.
There's nothing wrong in your code, i tried to copy it in my project and it worked good,
so your error could be probably when you check initVal...
what's the code you use to see if initVal is nil?
and are you sure that when/where you check initVal, that var/oblect is still visible ?
try to insert this immediately after your reading code:
NSLog(#"____text read in pref: %#", initVal);
it writes this in my console window -> __text read in pref: 1
of course it's an NSString, i hope you keep it in mind it's not an int or a NSNumber when you check it...
luca
It might be that the initialisation isn't happening. Put an NSLog in there to check it's executed.
It works fine for me with the same code:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *uid=#"1";
[defaults setObject:uid forKey:#"init_val"];
[defaults synchronize];
NSUserDefaults *defaultss = [NSUserDefaults standardUserDefaults];
NSString *initVal=[defaultss objectForKey:#"init_val"];
NSLog(#"Value of initVal: %#",initVal);
O/P on console: Value of initVal: 1
So try to do it with the same code with print on console.
Are you sure you properly initialize NSUserDefaults? When I initialize, in my app delegate, I always create the default user defaults by creating a dictionary of the default values then:
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
Where appDefaults is the dictionary. Then you should be able to access them correctly.

How to show a message only the first time an app is launched?

Is there an easy way to have an alert appear only the first time an app is launched, or will I have to do it manually by making a BOOL and having it set to FALSE after it's run the first time?
Sounds easy enough...
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if(![defaults boolForKey:#"hasBeenLaunchedBefore"]) {
//Show alert
[defaults setBool:YES forKey:#"hasBeenLaunchedBefore"];
[defaults synchronize];
}

First Time Opened Event

In my iPad app, I have a UIAlertView which pops up upon start up, however I only want this to popup the very first time the user starts the application. It's a setup prompt, saying, it's your first time, would you like to setup?
How can I do this? I have heard it's best to write out to a plist file and save a bool value, but how would I tackle this?
Modify the following code to suit your needs; you may put it in your root view controller viedDidLoad method. The code keeps track of the first run of the application, of the number of launches and whether or not the your setup prompt has been shown to the user.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:#"firstRun"]) {
// this is the first run
// store this information
[defaults setObject:[NSDate date] forKey:#"firstRun"];
[defaults setInteger:1 forKey:#"launches"];
[defaults setBool:NO forKey:#"setupPromptHasBeenShown"];
[defaults synchronize];
// now prompt the user to setup the app
// once the the prompt has been shown,
// if the user actually decides to setup the app,
// store this information again, so you will not prompt him/her again
[defaults setBool:YES forKey:#"setupPromptHasBeenShown"];
[defaults synchronize];
}
else{
// this is not the first run
NSInteger daysSinceInstall = [[NSDate date] timeIntervalSinceDate:[defaults objectForKey:#"firstRun"]] / 86400;
NSInteger launches = [defaults integerForKey:#"launches"];
[defaults setInteger:launches+1 forKey:#"launches"];
[defaults synchronize];
}
You could use NSUserDefaults to achieve this with just a few lines of code.
http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html