gpt4 book ai didi

iphone - Key Value Observing 中的无限循环

转载 作者:行者123 更新时间:2023-11-29 13:31:21 26 4
gpt4 key购买 nike

每次我运行代码时,它都会在无限循环中运行,并一遍又一遍地调用函数 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 *)keyPathofObject:(id)object
变化:(NSDictionary *)变化
上下文:(无效*)上下文
{

if([keyPath isEqualToString:@"myProperty"])
NSLog(@"调用");

}

我的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 的实现,并发布无限循环的部分回溯。最有可能的是,您的 getter 正在触发一个突变,该突变触发了 KVO,该突变触发了 getter,该突变触发了触发 KVO 的突变....


self.myProperty = availableNames;

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

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com