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