0

Still a bit new and I am having some issues I was hoping someone could help with. I am trying to load a JSON string coming from my server into a collectionview in iOS6 I can pull in the data using a fetchedData method called from the viewDidLoad method and that part works fine. In the fetchedData method, I break out the JSON data and place it in NSDictionaries and NSArrays and can dump the correct data to the log to see it.

The problem is when I try and use any of the information elsewhere in my code such as get the amount of elements in any of hte arrays to use as a counter to fill the collectionview.

It may be that I am tired but I can't seem to get my head around this part. The declaration of many of the main variables was in the fetchedData method and I thought since the were declared there it could be the reason I could not see them elsewhere so I moved the declaration of the variables to the interface section and was hoping this would make the variables GLOBAL and the fetchedData method continues to work just fine, but nowhere else.

When I put in breaks in the cell definition area I can see in the debugger window the variables come up as empty.

I am not sure what sections of the code you may want to see so let me know and I can post them but maybe someone could give an example of how arrays and dictionary items can be accessed in multiple methods.

To avoid confusion and to expose my hodgepodge of code at this point anyway here is the .m file or at least most of it Please don't rip to hard on the coding style I have been trying anything I could think of and tore it up pretty hard myself and it was late.

#import "ICBCollectionViewController.h"
#import "ICBCollectionViewCell.h"
#import "ICBDetailViewController.h"

@interface ICBCollectionViewController () {

NSDictionary* json;
NSDictionary* title;
NSDictionary* shortDescrip;
NSDictionary* longDescrip;
NSDictionary* price;
NSDictionary* path;
NSDictionary* sKU;
NSDictionary* audiotrack;
NSDictionary* audiotracksize;



NSArray* titles;
NSArray* shortDescription;
NSArray* longDescription;
NSArray* prices;
//    NSArray* paths;
NSArray* SKUs;
NSArray* audiotracks;
NSArray* audiotracksizes;
}
@end
/*
@interface NSDictionary(JSONCategories)
+(NSDictionary*)dictionaryWithContentsOfJSONURLString:(NSString*)urlAddress;
-(NSData*)toJSON;
@end

@implementation NSDictionary(JSONCategories)
+(NSDictionary*)dictionaryWithContentsOfJSONURLString:(NSString*)urlAddress
{
NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString: urlAddress] ];
__autoreleasing NSError* error = nil;
id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (error != nil) return nil;
return result;
}

-(NSData*)toJSON
{
NSError* error = nil;
id result = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:&error];
if (error != nil) return nil;
return result;
}
@end
*/
@implementation ICBCollectionViewController
@synthesize paths;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(kBgQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL: imobURL];
        [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
});

// Do any additional setup after loading the view.
}

- (void)fetchedData:(NSData *)responseData {
NSError* error;
//parse out the json data
json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

titles = [json objectForKey:@"title"]; //2
shortDescription = [json objectForKey:@"shortD"];
longDescription =  [json objectForKey:@"longD"];
prices = [json objectForKey:@"price"];
self.paths = [json objectForKey:@"path"];
SKUs = [json objectForKey:@"SKU"];
audiotracks = [json objectForKey:@"audiotrack"];
audiotracksizes = [json objectForKey:@"audiotracksize"];

 NSLog(@"paths: %@", paths); //3
//  NSLog(@"shortDescrip: %@", shortDescription);

NSInteger t=7;
    // 1) Get the latest loan
    title = [titles objectAtIndex:t];
    shortDescrip = [shortDescription objectAtIndex:t];
    longDescrip = [longDescription objectAtIndex:t];
    price = [prices objectAtIndex:t];
    path = [paths objectAtIndex:t];
    sKU = [SKUs objectAtIndex:t];
    audiotrack = [audiotracks objectAtIndex:t];
    audiotracksize = [audiotracksizes objectAtIndex:t];

    //NSLog(title.count text);
    //NSLog(title.allValues);

    // 2) Get the data
    NSString* Title = [title objectForKey:@"title"];
    NSString* ShortDescrip = [shortDescrip objectForKey:@"shortD"];
    NSString* LongDescrip = [longDescrip objectForKey:@"longD"];
    NSNumber* Price = [price objectForKey:@"price"];
    NSString* Path = [path objectForKey:@"path"];
    NSString* SKU = [sKU objectForKey:@"SKU"];
    NSString* AudioTrack = [audiotrack objectForKey:@"audiotrack"];
    NSNumber* AudioTrackSize = [audiotracksize objectForKey:@"audiotracksize"];





    /*************************HERE THE DATA EXISTS*******************************/
    /******** Path = "XYXYXYXYXYXY" for example  ********************************/

    // 3) Set the label appropriately
    NSLog([NSString stringWithFormat:@"Here is some data: Title: %@ Path %@ SKU: %@ Price: %@ Track %@ Size %@",Title, Path, SKU, Price, LongDescrip, AudioTrackSize]);

}







- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
//DetailSegue

if ([segue.identifier isEqualToString:@"DetailSegue"]) {
    ICBCollectionViewCell *cell = (ICBCollectionViewCell *)sender;
    NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
    ICBDetailViewController *dvc = (ICBDetailViewController *)[segue destinationViewController];
    dvc.img = [UIImage imageNamed:@"MusicPlayerGraphic.png"];

}
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
NSLog(@"paths qty = %d",[paths count]);
return 20;
}

// The cell that is returned must be retrieved from a call to    -dequeueReusableCellWithReuseIdentifier:forIndexPath:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier=@"Cell";
ICBCollectionViewCell *cell = (ICBCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

//    paths = [json objectForKey:@"path"];
NSDictionary* path = [paths objectAtIndex:indexPath.row];
NSString* Path = [path objectForKey:@"path"];
//    NSString* Path = [paths objectAtIndex:indexPath.row];
NSLog(@"%d",indexPath.row);



    /***********************HERE IT DOES NOT**************************/
    /******** Path = "" **********************************************/

NSLog(@"xxx");
NSLog(path);
NSLog(paths);
NSLog(Path);
NSLog(@"ZZZ");



Path=@"deepsleep";
NSLog(@"xxx");
NSLog(Path);
NSLog(@"ZZZ");





//    paths = [json objectForKey:@"path"];

//    NSString* Path = [path objectForKey:@"path"];

NSString *imagefile = [NSString stringWithFormat:@"https://imobilize.s3.amazonaws.com/glennharrold/data/%@/mid.png", Path];
NSLog(imagefile);
NSURL *url1=[NSURL URLWithString:imagefile];
dispatch_async(kBgQueue, ^{
    NSData *data1 = [NSData dataWithContentsOfURL:url1];
    cell.imageView.image =[[UIImage alloc]initWithData:data1];
});
return cell;
}


@end
Jeff Janes
  • 885
  • 1
  • 8
  • 22

2 Answers2

0

Try breaking out the JSON data and sorting it in the appDelegate. If you declare public variables there @property (nonatomic, strong) NSDictionary *myDict etc., then you can access those variables by importing your appDelegate and using the following code:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSDictionary *newDict = appDelegate.myDict;

Otherwise, you can store the information in a singleton, or in the root view controller. The key is to store your variables in a class that won't be deallocated. Most often, it is a bad idea to use a viewController for that purpose-- they have a tendency to be navigated away from, which deallocates the memory and gets rid of your variables. Google "model-view-controller" for more info.

Community
  • 1
  • 1
AMayes
  • 1,767
  • 1
  • 16
  • 29
  • the data I am talking about is all in a single .m file I will add that code to my question it contains all of methods I mention – Jeff Janes Apr 03 '13 at 17:12
  • If it's all declared in the .m file, then it won't be accessible because the properties aren't public. – AMayes Apr 03 '13 at 17:45
  • Does this include using them in the same .m file at the top I can show them but at the bottom they are gone how can I change this? – Jeff Janes Apr 03 '13 at 17:55
  • I've never tried using a single .m file for multiple implementations. I would recommend declaring the variables in your individual .h files with `@property`, and see if that helps. – AMayes Apr 03 '13 at 18:05
0

I found out what the main issue was it the ViewDidLoad method I was using a background activity to get the JSON data from my server and as that process was running the foreground was also being processed and since the rest of the code was based on a value returned when the background process finished the data was actually null so all data based on that single piece were also null and it looked as if it was not available. Once I made the process run in the foreground all the variable started having values.

Thanks for your assistance with this

Jeff Janes
  • 885
  • 1
  • 8
  • 22