いくつかの背景情報
データを更新するための管理バックエンドを持つアプリを作成しています。アプリは、オフライン サポート用にすべてのデータを SQLite データベースに保存します。バックエンドには、アプリケーションの最新の同期日付に応じて JSON で新しいデータを返すシンプルな API があります。データには、アプリにダウンロードして保存された画像が含まれています。
問題
私はそれのほとんどを解決しましたが、この問題で立ち往生しました。データが読み込まれたら、ループして ImageHandler クラスを開始します。これにより、画像がダウンロードされ、保存され、データベースに行が挿入されます。これは最初は正常に機能しますが、ループの最初のデータ行を通過しません。[imageHandler loadForPlace:row]; のコメントを外すと、/ [imageHandler loadForCategory:row]; 行ループは問題なく実行されます。ImageHandler クラスは、画像が存在するかどうかを確認し、存在しない場合はダウンロードします。
for (NSDictionary *row in data) {
NSLog(@"Action: %@. Loading images...", [row objectForKey:@"action"]);
imageHandler = [[Image alloc] init];
imageHandler.delegate = self;
if([[row objectForKey:@"action"] isEqualToString:@"CREATE_POST"] || [[row objectForKey:@"action"] isEqualToString:@"UPDATE_POST"]) {
NSLog(@"1 (pre)");
[imageHandler loadForPlace:row];
NSLog(@"1");
}
else {
NSLog(@"2 (pre)");
[imageHandler loadForCategory:row];
NSLog(@"2");
}
}
出力:
2012-04-18 10:32:08.698 Appname[17636:11603] Syncronize: Request done
2012-04-18 10:32:08.698 Appname[17636:11603] Found 2 items to create or update.
2012-04-18 10:32:08.698 Appname[17636:11603] Action: CREATE_POST. Loading images...
2012-04-18 10:32:08.699 Appname[17636:11603] 1 (pre)
2012-04-18 10:32:08.699 Appname[17636:11603] id: 778
2012-04-18 10:32:08.700 Appname[17636:11603] Image already exists, continuing...
2012-04-18 10:32:08.700 Appname[17636:11603] Image(s) saved
2012-04-18 10:32:08.700 Appname[17636:11603] Create place
2012-04-18 10:32:08.701 Appname[17636:11603] Has image
loadForItem (loadForPlace および loadForCategory によって呼び出されます):
ご覧のとおり、ループが継続しない原因となっているデリゲート呼び出しをコメントアウトしました。これを実行すると、ループは問題なく続行されます。私のテスト データでは、現在、loadForItem の「画像は既に存在します。続行中です...」という部分になってしまうため、デリゲート コードがコメント アウトされている場合は何もしません。
編集:わかりました、なぜこれまで気付かなかったのかわかりませんが、コンソールにエラーが出力されずにアプリケーションがハングします。くそ!これをクラッシュさせるのは、画像をチェックした後にデリゲートが私のメソッドを呼び出すときです。そのメソッドは、sqlite データベースの場所を挿入/更新し、エラーなしでアプリをクラッシュさせる fmdb を使用しています。これは、fmdb で更新/挿入するときに以前に発生しました。
Edit2:この UPDATE クエリに絞り込みました。エラーなしでアプリケーション全体をロックします。
[db executeUpdate:@"UPDATE categories SET number_places = 21 WHERE id = 44"];