2015-09-16 9 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 - 答案已更新。 –