Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 键值观测中的无限循环_Iphone_Objective C_Ios_Ios5_Key Value Observing - Fatal编程技术网

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
的属性和一个方法或getter
myProperty
。我使用
myProperty
连接到数据库,收集列的所有值并将其存储在
myProperty
中。我已经检查了
myProperty
方法..没有KVO它做得很好。但当我添加这个KVO时,它进入无限循环

同样,我也使用了

-(void)observeValueForKeyPath:(NSString*)键路径
对象:(id)对象的

更改:(NSDictionary*)更改
上下文:(void*)上下文
{

if([keyPath IsequalString:@“myProperty”])

NSLog(@“调用”);

}

我的
myProperty
方法是

-(void)myProperty
{


提前感谢您

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

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


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

将其拆分;创建可在适当时间调用的
loadAvailableNames
方法(
if(self.needsLoading)[self-loadaaAvailableNames];返回_-myProperty;
,等等)


另外——针对原始SQLite API编写代码既浪费时间,也很难正确处理。如果需要数据库的可移植性,请使用类似FMDB的工具。如果希望最大限度地利用系统功能,请使用核心数据。

首先,将
getMyProperty
重命名为simply
myProperty
。方法不应加前缀使用
获取

其次,您需要发布
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;