2012-08-04 70 views
0

每次我运行它在无限循环中运行的代码并一遍又一遍地调用函数myProperty。我应该做些什么来克服这一点..我写了下面的代码在viewController的viewDidLoad函数。Key Value Observing中的无限循环

[self.model addObserver:self forKeyPath:@"myProperty" options:NSKeyValueObservingOptionNew context:NULL];

[self.model myProperty];

在这里,我有一个Model类,它有一个名为myProperty属性和方法,或。我是用myProperty连接到一个数据库中的一个getter myProperty收集的所有值一列并将其存储在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

什么是self.model数据类型???是NSArray?有更详细的代码吗?你能发布无限循环代码吗? – 2012-08-04 15:44:42

+0

self.model是我的'Model'类的一个对象,也是viewController的一个属性。好吧,从来没有,我正在编辑这个问题。 – 2012-08-04 15:48:47

+0

当你发布最详细的信息时,你可以得到一个很好的答案。 – 2012-08-04 15:52:09

回答

1

首先,重命名getMyProperty简单myProperty。方法不应以前缀get为前缀。其次,你需要发布getMyProperty的实现,并发布无限循环的回溯部分。最有可能的,你的吸气剂引发突变,这是触发志愿触发触发触发志愿突变,吸气....


self.myProperty = availableNames; 

那是你的问题就在那里;你正在改变你的吸气状态,导致上面描述的无限循环。吸气剂真的不应该那么复杂;你是否真的想打开一个数据库连接并在每次请求可用名称时从磁盘读取数据?慢!

拆分出来;创建一个loadAvailableNames方法,可以在适当的时候调用(if (self.needsLoading) [self loadAavailableNames]; return _myProperty;等)。

另外 - 针对原始SQLite API写入既浪费时间,也很难得到正确的结果。如果您需要数据库的可移植性,请使用类似FMDB的内容。如果您想最大限度地利用系统功能,请使用核心数据。

+0

我已更新我的问题..请检查.. – 2012-08-04 16:13:02

+0

非常感谢你..我会试试看.. – 2012-08-04 16:35:11