在循环中调用委托仅在第一次工作

时间:2012-04-18 08:38:00

标签: iphone objective-c sqlite mobile fmdb

一些背景信息

我正在创建一个具有管理员后端的应用程序来更新它的数据。该应用程序将所有数据保存在SQLite数据库中以供离线支持。后端有一个简单的API,它根据应用程序的最新同步日期返回JSON中的新数据。数据包含下载并保存在应用程序中的图像。

问题

我已经解决了大部分问题,但却遇到了这个问题。加载数据后,我遍历它并启动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的“Image已存在,继续......”部分结束,因此在委托代码被注释掉时它不会执行任何操作。

编辑好的,我不知道为什么我之前没有注意到这一点,但应用程序挂起而没有任何错误输出到控制台。该死的!这是委托在检查崩溃的图像后调用我的方法的时候。该方法插入/更新我的sqlite数据库中的位置,我正在使用fmdb崩溃我的应用程序没有任何错误。这是在使用fmdb更新/插入之前发生的。

Edit2:我已将其缩小到此UPDATE查询。它锁定整个应用程序没有任何错误。 [db executeUpdate:@"UPDATE categories SET number_places = 21 WHERE id = 44"];

2 个答案:

答案 0 :(得分:1)

由于NSLog(@"1 (pre)")显然是从您提供的日志输出中调用的,但NSLog(@"1")不是,这表明-[Image loadForPlace:]没有返回。你必须在那里寻找原因。

答案 1 :(得分:0)

你确定数据有多个项吗?当你打电话时:

    for (NSDictionary *row in data) {
     // (...)
    }

尝试记录计数:

NSLog(@"data.count: %i", data.count);