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最後に呼び出されたファイルを取得してdidWriteData:、実際のファイルサイズと比較しようとしていましたDidFinishDownloading:

私のデザイン全体に関連していないことを確認するためだけに、すべてのプロジェクトを取り除きました。

実際のダウンロード状況を確認するためにNSTimerとの組み合わせを考えています。NKIssueContentStatusAvailable

それはすべてハッキーです。ではない?

アップデート:

  • XCode 5 を使用して iOS 6 および 7 で再現
  • メインスレッドで呼び出されるすべての NewsstandKit メソッド
  • Charlesプロキシ(フォアグラウンドのアプリ)でオフラインモードをシミュレートするときも同じ
4

1 に答える 1

0

飛行機に切り替えるときはもう問題ではありませんが、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 に答える