每次运行代码时,它都会在无限循环中运行,并反复调用函数myProperty
。我该怎么做才能克服这个..我在viewController的viewDidLoad函数中编写了以下代码。
[self.model addObserver:self forKeyPath:@"myProperty" options:NSKeyValueObservingOptionNew context:NULL];
[self.model myProperty];
这里我有一个Model
类,它有一个名为myProperty
的属性和一个方法或一个getter myProperty
。我使用myProperty
连接数据库a收集列的所有值并将其存储在myProperty
中。我已经检查过myProperty
方法..没有KVO 就做得很好。但是当我添加这个KVO时,这将进入无限循环。
我再次使用
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualToString:@"myProperty"])
NSLog(@"called");
}
我的myProperty
方法
- (void) myProperty
{
NSString *file = [[NSBundle mainBundle] pathForResource:@"MyDatabase" ofType:@"db"];
sqlite3 *database = NULL;
sqlite3_stmt *stmt;
NSMutableArray *availableNames=[NSMutableArray array];
if (sqlite3_open([file UTF8String], &database) == SQLITE_OK)
{
NSString *query=[NSString stringWithFormat:@"select * from Names"];
if(sqlite3_prepare_v2(database, [query UTF8String], -1, &stmt, NULL)==SQLITE_OK)
{
while (sqlite3_step(stmt)==SQLITE_ROW) {
[availableNames addObject:[[NSString alloc]initWithUTF8String:(char *)sqlite3_column_text(stmt,1 )]];
}
sqlite3_finalize(stmt);
}
}
sqlite3_close(database);
self.myProperty = availableNames;
}
提前谢谢
答案 0 :(得分:1)
首先,将getMyProperty
重命名为myProperty
。方法不应以get
为前缀。
其次,您需要发布getMyProperty
的实现并发布无限循环的部分回溯。最有可能的是,你的吸气剂正在触发一个触发KVO的突变,触发吸气剂触发触发KVO的突变....
self.myProperty = availableNames;
那就是你的问题;你正在从你的getter改变状态,这导致了上面描述的无限循环。吸气剂真的不应该那么复杂;你是否真的想要打开数据库连接并且每次要求可用名称时从磁盘读取?慢!
将其拆分;创建一个loadAvailableNames
方法,可以在适当的时间调用(if (self.needsLoading) [self loadAavailableNames]; return _myProperty;
等...)。
另外 - 针对原始SQLite API进行编写既浪费时间又很难做到。如果您需要数据库的可移植性,请使用类似FMDB的东西。如果您想最大限度地利用系统功能,请使用Core Data。