3

iOS アプリ内で録画した動画ファイルを Firebase にアップロードするときにプログレス バーをユーザーに表示したいのでobserveStatus、SDK の機能を使用しています。

// Create a root reference
FIRStorageReference *storageRef = [_storage reference];

// Create a reference to the video
FIRStorageReference *videoRef = [storageRef child:uuidString];

// Upload the file
FIRStorageUploadTask* uploadTask = [videoRef putFile:url metadata:nil];

[uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) {
    // A progress event occurred
    double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);

    NSLog(@"Video with ID %d recording upload progress: %f, completed unit count %lld, total unit count %lld", video.videoId, percentComplete, snapshot.progress.completedUnitCount, snapshot.progress.totalUnitCount);
}];

ただし、「Total Unit Count」は常に 0 のように見えます。つまり、計算された完了率は、0 による除算の状況全体で少しおかしくなります。

Video with ID 3 recording upload progress: inf, completed unit count 163922, total unit count 0

私は何か間違ったことをしていますか?ここで説明されているドキュメントに従ってください。

【Swiftにも再現】

4

3 に答える 3

1

編集済み

dataアップロードの使用は正常に機能しています:

    NSData *data = // ... some real data to upload

    FIRStorageReference *storageRef = [storage referenceForURL:@"gs://<YOURPATH>"];

    // Upload the file to the path
    FIRStorageUploadTask *uploadTask = [storageRef putData:data metadata:nil completion:^(FIRStorageMetadata * _Nullable metadata, NSError * _Nullable error) {

        if (error != nil) {
            // Error handle it
        } else {
            NSString *urlToDownload = metadata.downloadURL;
        }

    }];

    // Add a progress observer to an upload task
    [uploadTask observeStatus:FIRStorageTaskStatusProgress
                          handler:^(FIRStorageTaskSnapshot *snapshot) {
                              // A progress event occurred
                              double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
                              NSLog(@"\n\nloading...%f",percentComplete);
                          }];

これがOPまたは他の誰かに役立つことを願っています。

于 2016-06-03T01:30:39.773 に答える
1

これは私たちのどちらも望んでいる答えではありませんが、NSProgressインスタンスを正しく作成していない Firebase SDK にバグがあると推測しています。

そのため、回避策として、アップロード タスクを作成する前にファイル サイズを取得できます。私はこの拡張機能を使用しています (便宜上、IUO では非常にクラッシュします)。

extension NSFileManager {
    func fileSize(atUrl url: NSURL) -> Int64 {
        return try! NSFileManager.defaultManager().attributesOfItemAtPath(url.path!)[NSFileSize]!.longLongValue
    }
}

ファイル サイズの値をキャプチャtotalUnitCountし、計算の代わりに使用します。

FWIW https://firebase.google.com/support/contact/bugs-features/でこの問題のバグを報告しました

于 2016-06-04T05:36:17.883 に答える