Resuming a Download

A file download can be suspended automatically (e.g., by network failure) or manually (e.g., by user interruption). The suspended download can later be resumed so as to continue the download from the point where it was interrupted.

The following sample code shows how to resume a suspended download.

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];
      }
    }

Here is what is happening in the sample code:

  • Create a KiiBucket instance of the bucket that has the target KiiObject.
  • Create a KiiRTransferManager instance by calling the transferManager() method.
  • Get a list of KiiDownloader instances by calling the getDownloadEntries() method.
  • Define a progress and completion blocks.
  • Select the KiiDownloader instance to resume, and then call the transfer(progressBlock:andCompletionBlock:) method.

Checking the status of a KiiDownloader

The above sample code gets a KiiRTransferInfo object by executing the info() method of the KiiUploader. From this KiiRTransferInfo object, you can get its download progress information. This information includes the bytes transferred, the bytes in total, and the status (e.g., ongoing or suspended).