ダウンロードの再開

ファイルダウンロードは、受動的な理由(例:ネットワーク断)または能動的な理由(例:ユーザー操作)によって中断されることがあります。中断されたダウンロードは、後ほど中断したポイントから再開できます。

中断したファイルダウンロードを再開する例を以下に挙げます。

Swift:

  • // Instantiate a bucket.
    let bucket = KiiUser.current()!.bucket(withName: "MyBucket")
    
    // Get the transfer manager of the bucket.
    let manager = bucket.transferManager()
    
    // Prepare an array for storing KiiDownloader instances.
    let downloadEntries : [KiiDownloader]
    
    do{
      // Get all KiiDownloader instances.
      downloadEntries = try manager.getDownloadEntries() as! [KiiDownloader]
    }catch(let error as NSError){
      // Handle the error.
      return
    }
    
    for downloader in downloadEntries {
      // If the download status is "suspended"
      if downloader.info().status() == .rtStatus_SUSPENDED {
        // Create a progress block.
        let progress : KiiRTransferBlock = { (transferObject : KiiRTransfer, error ) in
          let info = transferObject.info()
          print("Progress : \(Float(info.completedSizeInBytes()/info.totalSizeInBytes()))")
        }
    
        do {
          // Resume downloading.
          try downloader.transfer(progressBlock: progress)
        } catch let error as NSError {
          // Handle the error.
          return
        }
      }
    }
  • // Instantiate a bucket.
    let bucket = KiiUser.current()!.bucket(withName: "MyBucket")
    
    // Get the transfer manager of the bucket.
    let manager = bucket.transferManager()
    
    // Prepare an array for storing KiiDownloader instances.
    let downloadEntries : [KiiDownloader]
    
    do{
      // Get all KiiDownloader instances.
      downloadEntries = try manager.getDownloadEntries() as! [KiiDownloader]
    }catch(let error as NSError){
      // Handle the error.
      return
    }
    
    for downloader in downloadEntries {
      // If the download status is "suspended"
      if downloader.info().status() == .rtStatus_SUSPENDED {
        // Create a progress block and a completion block.
        let progress : KiiRTransferBlock = { (transferObject : KiiRTransfer, error ) in
          let info = transferObject.info()
          print("Progress : \(Float(info.completedSizeInBytes()/info.totalSizeInBytes()))")
        }
        let completion : KiiRTransferBlock = { (transferObject : KiiRTransfer, error ) in
          if error != nil {
            // Handle the error.
            return
          }
        }
        // Resume downloading.
        downloader.transfer(progressBlock: progress, andCompletionBlock: completion)
      }
    }

Objective-C:

  • // Instantiate a bucket.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    
    // Get the transfer manager of the bucket.
    KiiRTransferManager *manager = [bucket transferManager];
    
    // Get all KiiDownloader instances.
    NSError *error = nil;
    NSArray *downloadEntries = [manager getDownloadEntries:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
    
    for (KiiDownloader *downloader in downloadEntries) {
      // If the download status is "suspended"
      if ([[downloader info] status] == KiiRTStatus_SUSPENDED) {
        // Create a progress block.
        KiiRTransferBlock progress = ^(id <KiiRTransfer> transferObject, NSError *retError) {
          KiiRTransferInfo *info = [transferObject info];
          NSLog(@"Progress : %f", (float) [info completedSizeInBytes] / [info totalSizeInBytes]);
        };
    
        // Resume downloading.
        [downloader transferWithProgressBlock:progress
                                     andError:&error];
        if (error != nil) {
          // Handle the error.
          NSLog(@"Transfer error!");
          return;
        }
      }
    }
  • // Instantiate a bucket.
    KiiBucket *bucket = [[KiiUser currentUser] bucketWithName:@"MyBucket"];
    
    // Get the transfer manager of the bucket.
    KiiRTransferManager *manager = [bucket transferManager];
    
    // Get all KiiDownloader instances.
    NSError *error = nil;
    NSArray *downloadEntries = [manager getDownloadEntries:&error];
    if (error != nil) {
      // Handle the error.
      return;
    }
    
    for (KiiDownloader *downloader in downloadEntries) {
      // If the download status is "suspended"
      if ([[downloader info] status] == KiiRTStatus_SUSPENDED) {
        // Create a progress block and a completion block.
        KiiRTransferBlock progress = ^(id <KiiRTransfer> transferObject, NSError *retError) {
          KiiRTransferInfo *info = [transferObject info];
          NSLog(@"Progress : %f", (float) [info completedSizeInBytes] / [info totalSizeInBytes]);
        };
        KiiRTransferBlock completion = ^(id <KiiRTransfer> transferObject, NSError *retError) {
          if (retError != nil) {
            // Handle the error.
            NSLog(@"Transfer error!");
            return;
          }
        };
    
        // Resume downloading.
        [downloader transferWithProgressBlock:progress
                           andCompletionBlock:completion];
      }
    }

ここでは以下の処理を行っています。

  • ダウンロード再開対象ファイルが紐付いている KiiObject が存在する Bucket のインスタンスを作成。
  • transferManager() メソッドを実行して、KiiRTransferManager インスタンスを作成。
  • getDownloadEntries() メソッドを実行して、KiiDownloader インスタンス一覧を取得。
  • Progress block と completion block をそれぞれ定義。
  • 再開する KiiDownloader インスタンスの transfer(progressBlock:andCompletionBlock:) メソッドを実行して、ダウンロードを再開。

KiiDownloader の状態確認

上記のサンプルコードのとおり KiiUploaderinfo() メソッドを使うと、KiiRTransferInfo オブジェクトを取得できます。このオブジェクトから、各転送に対する転送済みのバイト数、転送予定の全バイト数、状態(転送中/停止中など)を取得できます。