1

バックグラウンド fetch 呼び出しを介して、iOS の写真をカメラ ロールから外部サーバーにアップロードしようとしています。これに対応するために、バックグラウンド フェッチで ALAssetsLibrary をループして新しい写真を探します。新しい写真が見つかった場合、または新しいデバイスの場合はすべての写真が見つかった場合、その写真のバックグラウンド転送を開始します。私の計画は、NSURLSession を開始し、フェッチごとにいくつかのタスクを追加することでした。

これは機能します。ファイルがアップロードされます。しかし、コールバックには一貫性がありません。多くのバックグラウンド フェッチをシミュレートした後、didCompleteWithError コールバックが 100 回に 1 回発生しません。しかし、最大の問題は、多くの場合、タスクが一致しないことです。単一のタスクを作成した後にタスク識別子を確認すると、次のようになります。

NSURL *theURL = [NSURL fileURLWithPath:fullFileName isDirectory:NO];
NSURLSessionUploadTask *uploadTask = [_session uploadTaskWithRequest:request fromFile:theURL];
NSLog(@"Task id at start: %d", [uploadTask taskIdentifier]);

そしてコールバックで:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"Didcomplete - task_id: %d", [task taskIdentifier]);
...

私の出力は次のとおりです。

2013-12-31 14:02:36.628 Project[18685:1303] Didcomplete - task_id: 30
2013-12-31 14:02:36.768 Project[18685:70b] Task id at start: 31

バックグラウンドタスクのために出力が線形である必要はないことをすでにどこかで読んだと思います。しかし、識別子が異なるため、出力をタスクに一致させて、完了後にバックグラウンド タスクを正しく処理することができません。

誰でもこの動作を引き起こす原因を知っていますか? または私は何を試すことができますか?

4

1 に答える 1

0

これはシミュレーターの問題のようです。実際のデバイスでテストすると、タスク識別子が didcomplete コールバックで一致し、リクエストの適切な処理が可能になります。

于 2014-01-13T10:18:13.070 に答える