Iphone 键值观测中的无限循环
每次我运行代码时,它都在无限循环中运行,并反复调用函数Iphone 键值观测中的无限循环,iphone,objective-c,ios,ios5,key-value-observing,Iphone,Objective C,Ios,Ios5,Key Value Observing,每次我运行代码时,它都在无限循环中运行,并反复调用函数myProperty。我应该做些什么来克服这个问题..我已经在viewController的viewDidLoad函数中编写了以下代码 [self.model addObserver:self-forKeyPath:@“myProperty”选项:NSKeyValueObservingOptionNew-context:NULL] [self.model myProperty] 这里我有一个Model类,它有一个名为myProperty的属性
myProperty
。我应该做些什么来克服这个问题..我已经在viewController的viewDidLoad函数中编写了以下代码
[self.model addObserver:self-forKeyPath:@“myProperty”选项:NSKeyValueObservingOptionNew-context:NULL]代码>
[self.model myProperty]代码>
这里我有一个Model
类,它有一个名为myProperty
的属性和一个方法或gettermyProperty
。我使用myProperty
连接到数据库,收集列的所有值并将其存储在myProperty
中。我已经检查了myProperty
方法..没有KVO它做得很好。但当我添加这个KVO时,它进入无限循环
同样,我也使用了
-(void)observeValueForKeyPath:(NSString*)键路径
对象:(id)对象的
更改:(NSDictionary*)更改
上下文:(void*)上下文
{
if([keyPath IsequalString:@“myProperty”])
NSLog(@“调用”);
}
我的myProperty
方法是
-(void)myProperty
{
提前感谢您首先,将getMyProperty
重命名为simplymyProperty
。方法的前缀不应为get
其次,您需要发布getMyProperty
的实现,并发布无限循环的部分回溯。最有可能的情况是,您的getter正在触发一个突变,该突变触发KVO,该突变触发了触发KVO的getter
这就是您的问题所在;您正在更改getter的状态,这将导致上述无限循环。getter真的不应该那么复杂;您真的想在每次请求可用名称时打开数据库连接并从磁盘读取数据吗?慢
将其拆分;创建可在适当时间调用的loadAvailableNames
方法(if(self.needsLoading)[self-loadaaAvailableNames];返回_-myProperty;
,等等)
另外——针对原始SQLite API编写代码既浪费时间,也很难正确处理。如果需要数据库的可移植性,请使用类似FMDB的工具。如果希望最大限度地利用系统功能,请使用核心数据。首先,将getMyProperty
重命名为simplymyProperty
。方法不应加前缀使用获取
其次,您需要发布getMyProperty
的实现,并发布无限循环的部分回溯。最有可能的情况是,您的getter正在触发一个突变,该突变触发KVO,该突变触发了触发KVO的getter
这就是您的问题所在;您正在更改getter的状态,这将导致上述无限循环。getter真的不应该那么复杂;您真的想在每次请求可用名称时打开数据库连接并从磁盘读取数据吗?慢
将其拆分;创建可在适当时间调用的loadAvailableNames
方法(if(self.needsLoading)[self-loadaaAvailableNames];返回_-myProperty;
,等等)
另外——针对原始SQLite API编写代码既浪费时间又很难正确。如果您需要数据库的可移植性,请使用FMDB之类的工具。如果您想最大限度地利用系统功能,请使用核心数据。什么是self.model数据类型???NSArray?是否有更详细的代码?是否可以发布无限循环代码?self.model是我的model
类的一个对象,也是viewController的一个属性。好吧,没关系,我正在编辑这个问题。当你发布最详细的内容时,你会得到一个很好的答案。你需要发布你的getMyProperty
方法。@bitmapdata.com--我已经更新了。。请检查..self.model数据类型是什么?是NSArray吗?是你是一个更详细的代码吗?你能发布无限循环代码吗?self.model是我的model
类的一个对象,也是viewController的一个属性。好的,没关系,我正在编辑这个问题。当你发布最详细的代码时,你可以得到一个很好的答案。你需要发布你的getMyProperty
方法。@bitmapdata.com--我已经更新了请查收。。
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;
}
self.myProperty = availableNames;