1

コードを実行するたびに、無限ループで実行され、関数myPropertyを何度も呼び出します。これを克服するにはどうすればいいですか..viewControllerのviewDidLoad関数に次のコードを書きました。

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

[self.model myProperty];

ここにModelクラスがあり、名前付きのプロパティmyPropertyとメソッドまたはゲッターがあります。データベースに接続して、列のすべての値を収集し、に保存するためにmyProperty使用しています。メソッドを確認しました..KVOなしで問題なく動作しています。しかし、この KVO を追加すると、これは無限ループに入ります。myPropertymyPropertymyProperty

再び私も使用しました

- (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を単純に に変更しますmyProperty。メソッドの前にget.

getMyProperty次に、無限ループのバックトレースの実装と一部を投稿する必要があります。おそらく、あなたのゲッターは、KVOをトリガーする突然変異をトリガーするゲッターをトリガーするKVOをトリガーする突然変異をトリガーしています....


self.myProperty = availableNames;

それがあなたの問題です。上記の無限ループにつながるゲッターから状態を変更しています。ゲッターはそれほど複雑であってはなりません。利用可能な名前を尋ねるたびに、データベース接続を開いてディスクから読み取りますか? 遅い!

それを分割します。loadAvailableNames適切なタイミングで呼び出すことができるメソッドを作成します(if (self.needsLoading) [self loadAavailableNames]; return _myProperty;など)。

また、生の SQLite API に対して記述することは、時間の無駄であり、正しく行うのは非常に困難です。データベースの移植性が必要な場合は、FMDB などを使用してください。システムの機能を最大限に活用したい場合は、Core Data を使用してください。

于 2012-08-04T16:04:19.320 に答える