簡體   English   中英

關鍵值觀察中的無限循環

[英]Infinite loop in Key Value Observing

每次我運行代碼時,它都會無限循環運行,並一次又一次調用函數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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM