1

伙计们,我现在正在处理报亭的东西。我正在尝试处理网络错误。

您在下图中看到的是我的简单日志(“百分比:%i”在里面connection:didWriteData:totalBytesWritten:expectedTotalBytes:)。

我的问题在最后 3 行代码中描述。

在此处输入图像描述

我在这行做了什么:

  1. 在那条线之后,我打开了飞行模式(模拟网络错误)
  2. 我收到connection:didWriteData:totalBytesWritten:expectedTotalBytes:totalBytesWritten等于expectedTotalBytes
  3. 我收到了connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL

在那之后:

万岁,我刚刚下载完我的 .zip,我可以解压缩它,向我的视图宣布状态等等...... :(

我的问题是发生了什么事?

我已经实现connection:didFailWithError:了,但它没有被调用。

我试图抓住totalBytesWritten最后调用的 indidWriteData:并将其与实际文件大小进行比较DidFinishDownloading:

我已经剥离了我所有的项目,只是为了确保它与我的整个设计无关。

我正在考虑结合NSTimerNKIssueContentStatusAvailable检查真实的下载状态。

这一切都很糟糕。不是吗?

更新:

  • 使用 XCode 5 在 iOS 6 和 7 上重现
  • 在主线程上调用的所有 NewsstandKit 方法
  • 使用 Charles 代理(前台应用程序)模拟离线模式时也是如此
4

1 回答 1

0

切换到 Airplane 时不再是问题,但在限制 Charles 代理时仍然可以重现该问题。

我最终得到了这个解决方案(检查是否connection:didWriteData:...在说真话connectionDidFinishDownloading:destinationURL:):

- (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes
{
    ...
    self.declaredSizeOfDownloadedFile = expectedTotalBytes;
}

和:

- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *) destinationURL
{
    NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:destinationURL.absoluteString error:nil];
    NSNumber* destinationFileSize = [fileAttributes objectForKey:NSFileSize];
    if (destinationFileSize.intValue != self.declaredSizeOfDownloadedFile)
    {
        NSError* error = ...;
        [self connection:connection didFailWithError:error];

        self.declaredSizeOfDownloadedFile = 0;

        return;
    }

    ...
}
于 2014-01-20T17:02:05.157 回答