0

我正在开发一个涉及一些 SFTP 功能的小型免费 Cocoa 应用程序,特别是处理上传。该应用程序即将完成,但是在上传包含大量文件的文件夹时,我遇到了一个非常糟糕的问题。

我正在使用ConnectionKit来处理上传:

CKTransferRecord * record;
record = [connection recursivelyUpload:@"/Users/me/large-folder" 
                                    to:@"/remote/directory"];

这适用于大多数文件和文件夹。尽管在这种情况下 @"/Users/me/large-folder" 中有超过 300 个文件。调用此方法将我的 CPU 旋转到 100% 大约 30 秒,并且我的应用程序没有响应(mac 旋转球)。30 秒后,我的上传已排队并且工作正常,但这并不理想。显然,枚举这些文件的任何内容都会导致我的应用程序锁定直到完成。

不知道该怎么做。我对几乎任何解决方案都持开放态度——即使使用不同的框架,尽管我已经完成了我的研究,并且ConnectionKit似乎是目前最好的解决方案。

有任何想法吗?

4

2 回答 2

1

由于几乎可以肯定问题出在枚举上,因此您可能需要将枚举移动到异步操作中。他们很可能正在NSFileManager -enumeratorAtPath:为此使用。如果这是主要问题,那么最好的解决方案可能是将这项工作转移到自己的线程上。鉴于所涉及的时间很长,我怀疑他们实际上是在枚举期间读取文件。解决方案是在上传之前懒惰地读取文件。

Peter 说 Shark 很有帮助是正确的,但在长期成为 Shark 粉丝之后,我发现 Instruments 往往会更快地给出更多有用的答案。您可以使用 Instruments 更轻松地将磁盘 I/O 和内存分配轨道添加到 CPU 采样器。

如果您只以 100% 阻塞一个核心,我建议将 Active Thread 设置为“主线程”并将 Sample Perspective 设置为“All Sample Counts”。如果您以 100% 的速度阻塞所有内核,我建议将 Active Thread 设置为“All Threads”,将 Sample Perspective 设置为“Running Sample Times”。

于 2009-08-10T16:39:52.073 回答
1

使用鲨鱼。开始采样,开始下载,并在挂起结束后立即停止采样。

如果输出确认问题出在 ConnectionKit 中,您有两种选择:

  1. 切换到别的东西。
  2. 贡献一个使它不会挂起的补丁。

开源的美妙之处在于#2 是可能的。这是我推荐的。然后,您不仅会拥有一个快速的 ConnectionKit,而且一旦维护者接受了您的补丁,其他使用 CK 的人也可以拥有一个。

如果 Shark 发现问题不在ConnectionKit 中(分析规则 #2:您感到惊讶),那么您将获得 Shark 关于如何修复您的应用程序的指导。

于 2009-08-09T22:31:36.630 回答