2012-08-04 32 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