每次我运行代码时,它都会无限循环运行,并一遍又一遍地调用函数myProperty。我应该怎么做才能克服这个问题。.我已经在viewController的viewDidLoad函数中编写了以下代码。

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

[self.model myProperty];

这里我有一个Model类,它有一个名为myProperty的属性和一个方法或一个getter myProperty。我正在使用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;


}


先感谢您

最佳答案

首先,将getMyProperty重命名为简单的myProperty。方法不应以get为前缀。

其次,您需要发布getMyProperty的实现并发布无限循环的回溯部分。最有可能的是,您的吸气剂正在触发一个突变,该突变会触发KVO,而该突变又会触发KVO,而该吸气剂会触发一个触发KVO的突变。



self.myProperty = availableNames;


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

分开创建可以在适当时间调用的loadAvailableNames方法(if (self.needsLoading) [self loadAavailableNames]; return _myProperty;等)。

另外,使用原始SQLite API编写代码既浪费时间,又很难做到正确。如果您需要数据库的可移植性,请使用FMDB之类的东西。如果要最大程度地利用系统功能,请使用Core Data。

关于iphone - 关键值观察中的无限循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11809878/

10-12 15:44