报亭和网络错误

时间:2013-09-30 18:44:48

标签: ios objective-c nsurlconnection newsstand-kit

伙计们,我现在正在报亭上工作。我试图处理网络错误。

您在下面的图片中看到的是我的简单日志("百分比:%i"位于connection:didWriteData:totalBytesWritten:expectedTotalBytes:内)。

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

enter image description here

我在这方面做了什么:

  1. 在该行之后,我已经开启飞行模式(模拟网络错误)
  2. 我已收到connection:didWriteData:totalBytesWritten:expectedTotalBytes: totalBytesWritten等于expectedTotalBytes
  3. 我已收到connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
  4. 之后:

    万岁,我刚刚下载了我的.zip,我可以打开包装,在我的视图中宣布状态等等...... :(

    我的问题是进行了什么?

    我已实施connection:didFailWithError:,但未调用。

    我试图抓住上次调用totalBytesWritten中的didWriteData:并将其与DidFinishDownloading:

    中的实际文件大小进行比较

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

    我正考虑将NSTimerNKIssueContentStatusAvailable组合起来检查实际下载状态。

    一切都很糟糕。不是吗?

    更新

    • 使用XCode 5在iOS 6和7上重现
    • 主线程上调用的所有NewsstandKit方法
    • 使用Charles代理(前景中的应用程序)模拟离线模式时的情况相同

1 个答案:

答案 0 :(得分: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;
    }

    ...
}