ファイルのダウンロードを含むデータ処理を監視するための NSProgress オブジェクトのツリーがあります。ダウンロードは、バックグラウンド構成で NSURLSession を使用して行われます。
プロセスを開始すると、最上位の NSProgress オブジェクトが予期しない fractionCompleted の数値を報告します。問題をデバッグして (そして「Hello World」アプリケーションに分離して)、[NSURLSession downloadTaskWithRequest:] を呼び出した結果として NSProgress オブジェクトが作成され、上記のメソッドを呼び出した直後にその fractionCompleted プロパティが 1.0 であることがわかりました。この NSProgress オブジェクトは私の NSProgress ツリーの一部を取得するため、進行状況をオフセットすると、ツリーの上位に表示されます。
このサンプル アプリケーションでは、ダウンロードと並行してダミーのバックグラウンド タスクも開始しています。このタスクは、NSProgress オブジェクトを通じて進行状況を報告します。私がそうした理由は、NSURLSession が NSProgress オブジェクトを作成しない場合 (Apple が主張していること)、NSProgress ツリーに少なくとも 1 つのダウンが存在するためです。
ダウンロードとダミー タスクを起動した直後に NSProgress ツリーをログに記録すると、NSProgress ツリーは次のようになります。
<NSProgress: 0x7ff8dae06b10> : Parent: 0x0 / Fraction completed: 0.5000 / Completed: 0 of 1
<_NSProgressGroup: 0x7ff8dae0f450> : Portion of parent: 1 Children: 1
<NSProgress: 0x7ff8dae0f880> : Parent: 0x7ff8dae06b10 / Fraction completed: 0.5000 / Completed: 0 of 100
<_NSProgressGroup: 0x7ff8dae0fec0> : Portion of parent: 100 Children: 2
<NSProgress: 0x7ff8dad74b90> : Parent: 0x7ff8dae0f880 / Fraction completed: 1.0000 / Completed: 1 of 1
<NSProgress: 0x7ff8daf036c0> : Parent: 0x7ff8dae0f880 / Fraction completed: 0.0000 / Completed: 0 of 100
その結果、進捗レポートが奇妙になります。
ダウンロードを開始する呼び出し ([self resumeDownload]) をコメントアウトすると、NSProgress ツリーは次のようになります。
<NSProgress: 0x7febca52ac90> : Parent: 0x0 / Fraction completed: 0.0000 / Completed: 0 of 1
<_NSProgressGroup: 0x7febca529e60> : Portion of parent: 1 Children: 1
<NSProgress: 0x7febca529ff0> : Parent: 0x7febca52ac90 / Fraction completed: 0.0000 / Completed: 0 of 100
<_NSProgressGroup: 0x7febca52ced0> : Portion of parent: 100 Children: 1
<NSProgress: 0x7febca52d780> : Parent: 0x7febca529ff0 / Fraction completed: 0.0000 / Completed: 0 of 100
ご覧のとおり、fractionCompleted = 1.0 の余分な NSProgress オブジェクトはなく、進捗レポートは問題ありません。
NSURLSessionまたはその下にあるものでない場合、fractionCompleted = 1.0のNSProgressがどこから来ているのかわかりません。(Apple は、NSURLSession は NSProgress オブジェクトを作成しないと述べています。) この動作は、iOS 8 でのみ iOS 7 で確認できます (GM リリースであっても)。
バックグラウンド設定で NSURLSession を使用していることに注意してください! デフォルト構成では、問題は存在しません。
「予期しない」NSProgress オブジェクトが fractionCompleted = 1.0 で表示されるのはなぜですか? NSProgress API の使い方が間違っていますか? iOS 7 と 8 で動作が大きく異なる原因は何ですか?
サンプルコードはこちらから入手できます: https://s3-eu-west-1.amazonaws.com/pg.test/pubtest/NSProgress-20140830.zip
事前に助けてくれてありがとう。