rihekopo
rihekopo

Reputation: 3350

Retrieve data from NSObject's property

I have class called GlobalArray which is an NSObject. It has an NSArray property called globalData.

I'm passing data into globalData inside of my ViewControllerOne.m, it works perfect, i can print the log in the console. The problem is, that i'm unable to retrieve this data in ViewControllerTwo.m.

GlobalArray.h

#import <Foundation/Foundation.h>

@interface GlobalArray : NSObject

@property (nonatomic, retain) NSArray *globalData; // why retain?

GlobalArray.m

#import "GlobalArray.h"

@implementation GlobalArray

- (id) init
{
    self = [super init];
    if(self)
    {
        self.globalData = [[NSArray alloc] init];
    }
    return(self);
}

ViewControllerOne.m (GlobalArray.h imported into .h)

- (void)viewWillAppear:(BOOL)animated {

  [PubNub requestHistoryForChannel:my_channel from:nil to:nil limit:100 reverseHistory:NO withCompletionBlock:^(NSArray *message, PNChannel *channel, PNDate *fromDate, PNDate *toDate, PNError *error) {

            GlobalArray *fromHistory = [[GlobalArray alloc] init];
            fromHistory.globalData = message;
            NSLog(@"TEST LOG 1 %@", fromHistory.globalData);

}];
}

I try to retrieve it in ViewControllerTwo.m this way: (ViewController.h and GlobalArray.h is imported)

-(void) viewWillAppear:(BOOL)animated {

    GlobalArray *history = [[GlobalArray alloc] init];
    NSArray *sampleArr = [[NSArray alloc] init];
    sampleArr = history.globalData;
    NSLog(@" TEST LOG2 %@", sampleArr);


}

But TEST LOG2 is empty. I think i missed something in the ViewControllerTwo.m, but can't figure it out, for me it seems it's correct.

Upvotes: 0

Views: 556

Answers (2)

mxb
mxb

Reputation: 3330

If you'd like to avoid the classic Singleton pattern, you can bind a session object to the app delegate and implement the methods to login / logout:

@interface XXXAppDelegate : UIResponder <UIApplicationDelegate>

+ (XXXSession *)loginWithUserName:(NSString*)userName password:(NSString*)password;
+ (void)logout;

+ (XXXSession)currentSession;

@end

Then you define the data managed in your session:

@interface XXXSession : NSObject

@property (nonatomic, retain) NSArray *globalData;

@end

Initialize the session object it in application:didiFinishLaunchingWithOptions: or where it is needed in your application:

@implementation XXXAppDelegate {
    XXXSession *_currentSession;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self loginWithUserName: @"Test"];
}

@end

In your ViewControllers you can obtain the session as follow:

[XXXAppDelegate currentSession].globalData

This approach is similar to have a singleton object with the difference that the access to the instance is not offered by the singleton class itself (as stated in the definition of this Design Pattern) but it is implemented in the application delegate.

Upvotes: 1

Artin
Artin

Reputation: 241

Of course you'll get empty because you are initializing a separate object of type GlobalArray in your ViewControllerTwo. This is like you do:

Car car1 = [[Car alloc] init];
car1.name = @"BMW";
Car car2 = [[Car alloc] init];
NSLog(@"Car name = %@", car2.name);    <--- this will be empty!

You need to keep the GlobalArray variable somewhere to access it later in ViewControllerTwo instead of reinitializing it, or make the GlobalArray class singleton to always return the same instance instead of creating separate instances.

Upvotes: 0

Related Questions