0

I am calling getBoardingCards once here:

BRPBoardingCards *boardingCards = [[BRPBoardingCards alloc] init];
boardingCardsArray = [boardingCards getBoardingCards];

The array is returning null though (in the NSLog shown). What am I doing wrong?

- (NSArray*)getBoardingCards
{
    NSMutableArray *storedArray = [[NSMutableArray alloc] init];
    Utils *utils = [[Utils alloc] init];
    NSUserDefaults *properties = [utils getUserDefaults];



    // check if its the first time we are running the app.
    if(![[properties objectForKey:@"first_run"] isEqualToString:@"no"]){
        //I decided it is for american tourists and every booking office allows payment in dollars because I dont have a euros key on my keyboard.
        //Car also has lots of seats. 1337 of them to be precise.
        [self setNewBoardingCardWithCardType:@"car" WithPrice:@"$1.50" AndStartLocation:@"airport" AndEndLocation:@"restaurant" WithSeat:@"1337" andExtraInformation:@"We dont like you so we are giving you the back seat by yourself."];
        [self setNewBoardingCardWithCardType:@"helicopter" WithPrice:@"$500" AndStartLocation:@"restaurant" AndEndLocation:@"hospital" WithSeat:@"1" andExtraInformation:@"You are driving."];
        [self setNewBoardingCardWithCardType:@"train" WithPrice:@"$100" AndStartLocation:@"restaurant" AndEndLocation:@"ditch" WithSeat:@"STANDONHEAD" andExtraInformation:@"No Seats on this train. Gotta stand on your head. Dont forget your white lightning for the ditch."];
        [self setNewBoardingCardWithCardType:@"Fire Engine" WithPrice:@"$10" AndStartLocation:@"restaurant" AndEndLocation:@"burning house" WithSeat:@"HOSE" andExtraInformation:@"Take the hose to put out this fire we are heading to. "];
        [self setNewBoardingCardWithCardType:@"Nimbus" WithPrice:@"$300" AndStartLocation:@"burning house" AndEndLocation:@"popo floating island" WithSeat:@"LEVITATION" andExtraInformation:@"Dont forget to turn super saiyan on your way up there. "];
        [self setNewBoardingCardWithCardType:@"Sky Dive" WithPrice:@"$1020" AndStartLocation:@"popo floating island" AndEndLocation:@"home" WithSeat:@"GRAVITY" andExtraInformation:@"Ohh! that Adrenalines pumping. "];

        [self setNewBoardingCardWithCardType:@"Legs" WithPrice:@"$50" AndStartLocation:@"ditch" AndEndLocation:@"park bench hotel" WithSeat:@"VODKA" andExtraInformation:@"Time to get a good nights rest and sobre up. "];
        [self setNewBoardingCardWithCardType:@"Bicycle" WithPrice:@"$5" AndStartLocation:@"park bench hotel" AndEndLocation:@"home" WithSeat:@"BIKESEAT1" andExtraInformation:@"What a terrible hangover. Time to head home. "];

        [self setNewBoardingCardWithCardType:@"ambulance" WithPrice:@"$40" AndStartLocation:@"hospital" AndEndLocation:@"home" WithSeat:@"LEVITATION" andExtraInformation:@"Well that was a bad idea! "];

        [properties setObject:@"no" forKey:@"first_run"];
        [properties synchronize];

        NSLog(@"did set first run to no");
    }

        storedArray = [[properties objectForKey:@"cards"] mutableCopy];


        NSLog(@"getBoardingCards storedArray: %@", storedArray);

    return storedArray;
}

- (NSArray*)getBoardingCardsByType:(NSString*)cardType
{
    // at this point i would create a for loop and iterate through the array checking if (type isEqualToString:cardType).
    // But this is just an idea for later. To go by only a certain type of route. 
    return nil;
}



- (void)setNewBoardingCardWithCardType:(NSString*)cardType WithPrice:(NSString*)price AndStartLocation:(NSString*)startLocation  AndEndLocation:(NSString*)endLocation WithSeat:(NSString*)seatCode andExtraInformation:(NSString*)extraInfo{

    // populate the dictionary with data.
    NSMutableDictionary *card = [[NSMutableDictionary alloc] init];
    [card setObject:cardType forKey:@"type"];
    [card setObject:price forKey:@"price"];
    [card setObject:startLocation forKey:@"startLocation"];
    [card setObject:endLocation forKey:@"endLocation"];
    [card setObject:seatCode forKey:@"seat"];
    [card setObject:extraInfo forKey:@"info"];

    // get our stored array.
    Utils *utils = [[Utils alloc] init];
    NSUserDefaults *properties = [utils getUserDefaults];
    NSMutableArray *storedArray = [[properties objectForKey:@"cards"] mutableCopy];

    [storedArray addObject:card];
    // set the stored array.
    [properties setObject:storedArray forKey:@"cards"];
    [properties synchronize];

}
3
  • 1
    What's the point of setting storedArray = [[NSMutableArray alloc] init] if you unconditionally override it in storedArray = [[properties objectForKey:@"cards"] mutableCopy];? Commented Oct 4, 2013 at 11:15
  • An array can't possibly contain nil entries. When an array "returns null" it's almost certain that the array does not exist. Commented Oct 4, 2013 at 11:17
  • where r u setting the values for the key 'cards'? Commented Oct 4, 2013 at 11:20

1 Answer 1

4

You're not creating the cards mutable array in the NSUserDefaults. This line (in setNewBoardingCardWithCardType:):

NSMutableArray *storedArray = [[properties objectForKey:@"cards"] mutableCopy];

is essentially

NSMutableArray *storedArray = [nil mutableCopy];

which is the same as

NSMutableArray *storedArray = nil;

Check if the object for this key exist, if not - create it and then use it.

Sign up to request clarification or add additional context in comments.

2 Comments

that was it thanks! I dont know how to Missed that how silly of me!
Happens all the time.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.