2015-09-16 8 views
0

我有两个类InterfaceControllerLoadInterfaceControllerWatchKit问题保留类之间的数据

我正在提取LoadInterfaceController中的信息,我希望传递给InterfaceController类中的variable

LoadInterfaceController

- (void)fetchData { 
    NSArray *database = //fetched information 
    //... on fetch complete 
    InterfaceController *interfaceController = [InterfaceController alloc]; 
    [interfaceController initilizeDatabase:database]; 
} 

InterfaceController

@property (nonatomic) NSArray *db; 

- (void)initilizeDatabase:(NSArray *)database { 
    self.db = database; 

    NSLog(@"database count: %d", database.count); //: 3 
    NSLog(@"db count: %d", self.db.count); //: 3 

    [self utilizeInformation]; 
} 

- (void)utilizeInformation { 
    NSLog(@"db count: %d", self.db.count); //: 0 
    //... 
} 

db的信息不保留在initilizeDatabase:功能之外。

我试过在main thread上运行它(如解释here),但是信息仍然没有保留。我如何指定线程来传递我的第二课中的信息?

回答

2

线程或保留没有问题,从这个角度看,一切都是正确的。但还有另一个问题:当您以编程方式初始化InterfaceController时,将创建它的一个实例,并且db属性将完美存储,直到Watch再次加载它为止,因为Watch会自己创建另一个InterfaceController实例,因此您会得到空的db新实例的属性。

我在这里建议的解决方案是将一个模型实体添加到您的架构中,该架构将充当单例类并确保您的数据始终可用。

这里是一个实现考虑到你的例子:

XYZDataBaseManager

@interface XYZDataBaseManager : NSObject 

    + (nonnull XYZDataBaseManager *)sharedInstance; 

    - @property (nonnull, strong) NSMutableArray *data; 

@end 


@implementation XYZDataBaseManager 

+ (XYZDataBaseManager *)sharedInstance { 
    static dispatch_once_t once; 
    static XYZDataBaseManager *instance; 
    dispatch_once(&once, ^{ 
     instance = [[XYZDataBaseManager alloc] init]; 
    }); 
    return instance; 
} 

@end 

LoadInterfaceController

- (void)fetchData { 
    NSArray *database = //fetched information 
    [XYZDataBaseManager sharedInstance].data = database; 
} 

InterfaceController

@property (nonatomic) NSArray *db; 

- (void)utilizeInformation { 
    NSLog(@"db count: %d", [XYZDataBaseManager sharedInstance].data.count]); 
} 

当然,还有很多需要改进的地方,但我认为主要的想法很清楚。而且我也没有执行这个代码,所以可能会出现一些错别字(我更加快速)。

+0

一个例子会有帮助。 –

+1

@Aleksander Azizi - 答案已更新。 –