【问题标题】:NSData writeToFile not completely written when readingNSData writeToFile 读取时未完全写入
【发布时间】:2012-06-21 08:41:38
【问题描述】:

我正在编写一个 iPhone 应用程序,它允许您在一个视图中浏览图像,并在另一个视图中创建它们。

创建图像的视图将使用以下代码将图像写入文档文件夹(当点击按钮关闭视图时):

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];

浏览器视图将使用以下方式加载图像:

UIImage *image = [UIImage imageWithContentsOfFile:path];

现在 10 次中有 9 次都能完美运行。十分之一的图像在我加载之前没有完全写入,所以它的下半部分将是黑色的。一切最终都会被写入 - 如果我在浏览器中重新加载图像,则会显示完整的图像。我认为这些东西在一个线程中总是一致的。

我可以做些什么来防止这种行为吗?

现在我正在考虑将新创建的图像传回浏览器,但这似乎是一种 hack,因为浏览器也会显示您之前创建的所有图像。

【问题讨论】:

  • 你能显示哪个方法正在调用writeToFile:atomically:吗?是按钮点击处理程序,还是viewWillDisappear:,还是别的什么?你检查过writeToFile: 的返回值吗?你能试试writeToFile: 的另一个变体,它允许你传入NSError吗?
  • 当点击按钮然后关闭视图时图像被保存。图像在浏览器视图的 viewDidLoad 中加载。实际上,它很难重现,我认为它更像是 1/100 或 1/1000。昨天看了3-4次。恐怕已经够打扰了。现在我来回翻转时似乎不会发生这种情况。
  • 另外,我已经在多个设备(4S、3GS、iPad)上看到了这个。
  • 这里有一个类似的未回答问题:cocoabuilder.com/archive/cocoa/…。也许对运行循环存在未记录的依赖关系?
  • 啊,我并不孤单。我发现了同样的问题:stackoverflow.com/questions/11161079/…(仍然没有解决方案)。

标签: objective-c ios cocoa-touch


【解决方案1】:

如果您确定图像正在使用writeToFile:atomically: 保存在主 (UI) 线程上,然后图像也在主线程上加载,那么看起来该方法维护其存在问题合约在调用返回时完成操作。 iOS 有时确实存在错误,也许你发现了。

不过,我还要注意,我看到类似问题出现的一种可能方式是,当离开一个视图以显示另一个视图时调用 assumptions are made about the order,其中 viewWillAppearviewDidDisappear 等被调用。所以,我还要确保图像没有以这些方法之一保存。

既然你说这个问题显示了一个 half 可见的图像,我猜这不是这种情况,但我将警告包含在 order-of- 中遇到类似问题的任何其他人操作。

【讨论】:

    【解决方案2】:

    对于未及时完成 UI 的进程的标准解决方案是将其拆分为一个新线程。也许您应该创建一个单独的线程来保存图像,然后通过委托方法通知 UI 以更新自身。

    【讨论】:

    • 这无济于事,因为现在它在主线程上执行,因此可以保证在显示新视图之前完成操作。
    • @rasmus,如果涉及大量工作(如果您没有及时看到可靠写入的文件,则必须有),那么您应该在后台线程。你不应该在 UI 线程上做任何事情来试图强制顺序执行。用户不喜欢冻结的 UI。
    • @Nate 好吧,也许不是,但延迟不是我的问题,所以这也不是我的问题的解决方案。请再次阅读问题。此外,在这种情况下,延迟并不显着。问题不是性能/延迟,而是正确性。新线程无法解决此问题。
    • @rasmus 新线程解决您的问题。您希望图像立即显示。如果不是 100% 编写,您只会看到一部分。 UI 会收到通知(可能非常快)并自行更新 - 现在您可以看到完整的图像。如果您想避免这种影响,您必须让您的 UI 在显示图片的任何部分之前等待委托通知。在这种情况下,您可能还希望显示活动指示器等。
    • @Mundi 你没抓住重点。等待更长的时间只是另一个技巧。当 writeToFile 完成时,文件应该被完全写入。新线程也会这么认为。
    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 2012-05-18
    • 2011-09-21
    • 1970-01-01
    • 2011-08-02
    • 2011-11-06
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多