我正在DragonFire SDK中开发一个iPhone应用程序,我在其中使用NetSend()来显示一个图像,以及一堆文本文件,我将在本地解析并藏匿在SQLite数据库中以便快速查询。 (这是因为数据位于没有智能的服务器上,只有平面文件被FTP到位。)NetSend调用的位如下所示:
NetSend("http://some/path/images/some-image.png", ReceivedThumbnail);
NetSend("http://some/path/Downloads/file1.txt", ReceivedFile1);
NetSend("http://some/path/Downloads/file2.txt", ReceivedFile2);
NetSend("http://some/path/Downloads/file3.txt", ReceivedFile3);
NetSend("http://some/path/Downloads/file4.txt", ReceivedFile4);
NetSend("http://some/path/Downloads/file5.txt", ReceivedFile5);
显然我已经改变了文件名和一切,以保护无辜者。以下是其中一个回调示例:
int ReceivedThumbnail(int event, char *response, int length) {
printf("ReceivedThumbnail\n");
if (event == 0) return 0;
FileDelete("Thumbnail.png");
int ThumbnailFile = FileCreate("Thumbnail.png");
FileWrite(ThumbnailFile, response, length);
FileClose(ThumbnailFile);
return 0;
}
我已经确认正在执行NetSend块,并且文件存在于Web服务器上,但大多数时候回调都不会触发。其中一些尚未编写,因此只包含printf(),但它永远不会发生。
奇怪的是,在昨天对此感到沮丧并且还要做其他事情之后,当我今天早上回来再试一次时,其中一个做了运行,这足以让我看到一个错误代码。我修复了错误,但现在它不会再运行了。有问题的文件每天都会更新,所以我想知道,NetSend中是否有某种缓存,如果文件因为之前运行的NetSend而没有更新,它将不会触发回调?如果是这样,有没有办法禁用或覆盖它? (我可以看到如何在生产中使用它;实际上,我已经编写了自己的缓存代码以避免调用NetSend,尽管它当前已被禁用。但是当我正在开发代码时,我需要得到这个回调继续发生,直到我正确地将数据输入SQLite。)
要检查什么的其他想法?
答案 0 :(得分:0)
我从DragonFire支持团队那里听到了回复,并找到答案。问题是,当NetSend()调用正在创建线程时,每个NetSend()都会取消前一个线程,因此多线程的好处就会丢失。因此,要像这样做一组NetSend(),你需要创建一个“菊花链”,其中来自第一个的回调执行它必须做的任何事情,然后为第二个回调启动另一个NetSend(),其回调启动第三个等等,最后的回调然后调用“主”函数(当然不是AppMain())。当然,它使我的源代码更难以遵循,但似乎有效。
DragonFire支持同意这应该是,但不是,在API文档中,所以希望它将在未来的版本中。