1

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

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

[self.model myProperty];

这里我有一个Model类,它有一个名为的属性myProperty和一个方法或一个 getter myProperty。我myProperty用来连接到数据库,收集列的所有值并将其存储在myProperty. 我检查了方法..没有 KVOmyProperty它做得很好。但是当我添加这个 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;


}

先感谢您

4

1 回答 1

1

首先,重命名getMyProperty为 simple myProperty。方法不应以 . 为前缀get

其次,您需要发布getMyProperty无限循环的回溯的实现和部分。最有可能的是,您的 getter 正在触发一个触发 KVO 的突变,该突变触发了触发 KVO 的突变的 getter ....


self.myProperty = availableNames;

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

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

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

于 2012-08-04T16:04:19.320 回答