0

我正在 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。)

关于检查什么的任何其他想法?

4

1 回答 1

0

我收到了 DragonFire 支持团队的回复并找到了答案。问题是当 NetSend() 调用创建线程时,每个 NetSend() 都会取消前一个,因此失去了多线程的好处。因此,要执行一组这样的 NetSend(),您需要创建一个“菊花链”,其中第一个回调执行它必须做的任何事情,然后为第二个回调启动另一个 NetSend(),其回调开始第三个等等,最后的回调然后调用一个“主”函数(当然不是 AppMain())。当然,这使我的源代码更难理解,但它似乎有效。

DragonFire 支持同意这是应该在 API 文档中但不是的那种东西,所以希望它会出现在未来的版本中。

于 2014-03-17T16:36:59.463 回答