WatchKit 问题在 类 之间保留数据
WatchKit issue retaining data between classes
我有两个 class 名为 InterfaceController
和 LoadInterfaceController
。
我正在 LoadInterfaceController
中获取信息,我希望将其传递给 InterfaceController
class.
中的 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所解释的),但信息仍然没有保留。我如何指定线程来传递来自我的第二个 class?
的信息
线程和保留都没有问题,从这个角度来看一切都是对的。但是还有另一个问题:当您以编程方式初始化 InterfaceController
时,您会创建它的一个实例并且 db
属性 会被完美存储,直到您的 Watch 再次加载它,因为 Watch 创建了另一个实例InterfaceController
结果是你在新实例上得到空的 db
属性。
我在这里建议的解决方案是在您的体系结构中添加一个模型实体,该实体将充当单例 class 并确保您的数据始终可用。
这是考虑到您的示例的实现:
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]);
}
当然还有很多需要改进的地方,但我认为主要思想很明确。而且我没有执行这段代码,所以可能会有一些拼写错误(我更倾向于swift)。
我有两个 class 名为 InterfaceController
和 LoadInterfaceController
。
我正在 LoadInterfaceController
中获取信息,我希望将其传递给 InterfaceController
class.
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所解释的),但信息仍然没有保留。我如何指定线程来传递来自我的第二个 class?
线程和保留都没有问题,从这个角度来看一切都是对的。但是还有另一个问题:当您以编程方式初始化 InterfaceController
时,您会创建它的一个实例并且 db
属性 会被完美存储,直到您的 Watch 再次加载它,因为 Watch 创建了另一个实例InterfaceController
结果是你在新实例上得到空的 db
属性。
我在这里建议的解决方案是在您的体系结构中添加一个模型实体,该实体将充当单例 class 并确保您的数据始终可用。
这是考虑到您的示例的实现:
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]);
}
当然还有很多需要改进的地方,但我认为主要思想很明确。而且我没有执行这段代码,所以可能会有一些拼写错误(我更倾向于swift)。