我正在开发一个小型的免费Cocoa应用程序,该应用程序涉及一些SFTP功能,专门用于上传。该应用程序即将完成,但我在上传包含大量文件的文件夹方面遇到了一个非常糟糕的问题。
我正在使用ConnectionKit来处理上传:
CKTransferRecord * record;
record = [connection recursivelyUpload:@"/Users/me/large-folder"
to:@"/remote/directory"];
这适用于大多数文件和文件夹。虽然在这种情况下@“/ Users / me / large-folder”中有超过300个文件。调用此方法可将CPU高达100%旋转约30秒,并且我的应用程序没有响应(mac spin ball)。 30秒后我的上传排队并且工作正常,但这并不理想。显然,无论枚举这些文件是什么导致我的应用程序锁定,直到它完成。
不确定该如何处理。我对任何解决方案持开放态度 - 即使使用不同的框架,尽管我已经完成了我的研究,ConnectionKit似乎是最好的解决方案。
有什么想法吗?
答案 0 :(得分:1)
使用鲨鱼。开始采样,开始下载,一旦挂起结束,就停止采样。
如果输出确认问题出在ConnectionKit中,您有两种选择:
开源之美是#2是可能的。这是我推荐的。然后,你不仅会有一个快速的ConnectionKit,但是一旦维护者接受了你的补丁,那么使用CK的其他人也可以拥有它。
如果Shark在ConnectionKit中发现问题不(分析规则#2:你会感到惊讶),那么你有Shark关于如何修复的指导你的应用。
答案 1 :(得分:1)
由于问题几乎肯定在枚举上,因此您可能需要将枚举移动到异步操作中。很可能他们正在使用NSFileManager -enumeratorAtPath:
。如果这是主要问题,那么最好的解决方案可能是将该工作转移到自己的线程上。鉴于涉及的时间很长,我怀疑他们实际上是在枚举期间阅读文件。解决方法是在上传之前懒洋洋地阅读文件。
彼得是正确的,鲨鱼是有帮助的,但作为一个长期的鲨鱼粉丝,我发现乐器往往更快地提供更多可用的答案。您可以使用Instruments更轻松地将磁盘I / O和内存分配轨道添加到CPU采样器。
如果您仅以100%阻止一个核心,我建议将Active Thread设置为“Main Thread”并将Sample Perspective设置为“All Sample Counts”。如果您以100%阻止所有核心,我建议将Active Thread设置为“All Threads”,将Sample Perspective设置为“Running Sample Times”。