Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在循环中调用委托仅在第一次起作用_Iphone_Objective C_Sqlite_Mobile_Fmdb - Fatal编程技术网

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

Iphone 在循环中调用委托仅在第一次起作用,iphone,objective-c,sqlite,mobile,fmdb,Iphone,Objective C,Sqlite,Mobile,Fmdb,一些背景信息 我正在制作一个应用程序,它有一个用于更新数据的管理后端。该应用程序将所有数据保存在SQLite数据库中,以供脱机支持。后端有一个简单的API,根据应用程序的最新同步日期以JSON格式返回新数据。数据包含下载并保存在应用程序中的图像 问题 我已经解决了大部分问题,但在这个问题上陷入了困境。加载数据后,我循环遍历它并启动ImageHandler类,该类将下载图像,保存图像并在数据库中插入一行。这在第一次使用时效果很好,但不会超过循环中的第一个数据行。如果我取消注释[imageHandl

一些背景信息

我正在制作一个应用程序,它有一个用于更新数据的管理后端。该应用程序将所有数据保存在SQLite数据库中,以供脱机支持。后端有一个简单的API,根据应用程序的最新同步日期以JSON格式返回新数据。数据包含下载并保存在应用程序中的图像

问题

我已经解决了大部分问题,但在这个问题上陷入了困境。加载数据后,我循环遍历它并启动ImageHandler类,该类将下载图像,保存图像并在数据库中插入一行。这在第一次使用时效果很好,但不会超过循环中的第一个数据行。如果我取消注释[imageHandler loadForPlace:row];/[imageHandler loadForCategory:行];行循环运行正常。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调用):

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的“映像已经存在,继续…”部分结束,因此当代理代码被注释掉时,它不会做任何事情


编辑:好的,我不知道为什么我以前没有注意到这一点,但是应用程序挂起时没有向控制台输出任何错误。该死当代理在检查图像后调用我的方法时,会导致崩溃。该方法插入/更新我的sqlite数据库中的位置,我使用的是fmdb,它会使我的应用程序崩溃,不会出现任何错误。这在使用fmdb更新/插入时发生过

Edit2:我已经将范围缩小到这个更新查询。它会锁定整个应用程序,不会出现任何错误。
[db executeUpdate:@“更新类别集编号\u位置=21,其中id=44”]

您确定数据包含多个项目吗?当你打电话时:

    for (NSDictionary *row in data) {
     // (...)
    }
尝试记录计数:

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

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

请给出imageHandler方法的代码。然后我可以看到发生了什么。是的,它包含两行。两行都有图像。是的,你说得对。我已经在loadForItem中一点一点地注释掉了,在调用代理时似乎出现了问题。我在上面的问题中发布了这个方法。好吧,我不知道为什么我以前没有注意到这一点,但是应用程序挂起,没有任何错误输出到控制台。该死当代理在检查图像后调用我的方法时,会导致崩溃。该方法插入/更新我的sqlite数据库中的位置,我使用的是fmdb,它会使我的应用程序崩溃,不会出现任何错误。这在使用fmdb更新/插入时发生过。