Showing posts with label API. Show all posts
Showing posts with label API. Show all posts

Tuesday, August 28, 2018

Protocol Extensions for Default and Convenient API


In this tutorial, let’s see how protocol extensions can be used as default and convenient API.

I am taking a Movable protocol which is having a move method.


     
  protocol Movable {
    func move(at minimumSpeed: Float)
  }


I am creating a class called Car which confirms to Movable protocol.


     
  class Car: Movable {
    
   }


This gives a build error.



We need to implement move method as Car is confirming to Movable.

Instead of this forced implementation, using protocol extensions, we can write default implementation.


     
  extension Movable {

    func move(at minimumSpeed: Float) {
      print("Moving @ \(minimumSpeed) MPH")
    }

  }

  let car = Car()
  car.move(at: 40.0)


This is how we can leverage protocol extensions for default implementations.

Now, What If I don’t want to mention the speed every time. I need to go with minimum speed 40.0 as default speed.

This can also be done using the protocol extensions, by having default value for minimumSpeed.


     
  extension Movable {

 func move(at minimumSpeed: Float = 40.0) 
  {
     print("Moving @ \(minimumSpeed) MPH")
  }

 }

 let car = Car()
 car.move()


Simple and useful. Isn’t it?

Hope this post is useful. Feel free to comment incase of any queries.


Monday, August 24, 2015

iOS Box API content fetch limit using Objective c

This article is for iOS developers who are using BOX API in their application. As this is for BOX API users, Here I am not discussing about what is BOX and what it's API gives us. Directly I want to discuss about, How to play with the content limit option in the BOX API.

Here I want to tell like why I am writing this article for such a simple thing. It's look like that :). I used BOX API in one of my applications, where client will setup all his content (folders & files) in the BOX and my iOS app has to fetch the content and has to able to play with the content like upload, download, rename, creation of folders etc.

There were around 120 folders in the BOX that my client has setup. He has perfectly organised those for demo purpose. I have developed this application with a sample BOX account which has around 20 folders like that. I am fetching content using the BOX API's BoxFoldersRequestBuilder and foldersManager classes. I used below code to fetch root folder content from the BOX using BOX API classes. 



BoxFoldersRequestBuilder *folderReqBuilder = [[BoxFoldersRequestBuilder alloc]      
                     initWithQueryStringParameters:@{ @"fields" : @"name,type,
description,tags,id,size,created_at,created_by,modified_at,modified_by,parent"}];   
[[BoxSDK sharedSDK].foldersManager folderItemsWithID:folderID 
                     requestBuilder: folderReqBuilder success:success failure:failure];


As I had only 20 folders in the BOX development account, the above service call to BOX gives me all the 20 folders metadata (name, description etc...). So, I am good for development. But the actual mistake is I didn't check for the default number of assets metadata that BOX gives. Obviously If I have around 1000 items in my BOX, it is not supposed to give me all the assets metadata. 

This content limit option came into picture after sending the application to client. I have used UICollectionView to display the content(files & folders) to the app users. As my client has around 120 assets, he is not able to see all the 120 assets in the UICollectionView. Everytime he is able to see only the first 100 assets. 

We though, it's a rendering issue of the UICollectionView. But it's not. The issue here is by default BOX gives only first 100 assets. So, If we want more content, we need to play with the 'limit' option at the time of requesting the metadata of the root folder content.


For this, I have added limit option in the BoxFoldersRequestBuilder of BOX API as shown below.

BoxFoldersRequestBuilder *folderReqBuilder = [[BoxFoldersRequestBuilder alloc] 
                     initWithQueryStringParameters:@{ @"fields" : @"name,type,
                                        description,tags,id,size,created_at,created_by,modified_at,
                                        modified_by,parent",@"limit":@150}];
    
[[BoxSDK sharedSDK].foldersManager folderItemsWithID:folderID 
                     requestBuilder: folderReqBuilder success:success failure:failure];

I have added 'limit' key and 150 as the value in the 'initWithQueryStringParameters' of the folderRequestBuilder. That means, I am requesting for the first 150 assets instead of the default 100 assets limit. My request for 150 assets is because I know that my client is having around 150 assets in the root folder. So, the limit value should be based on the number of assets that we want to display. If there are more number of assets, we can go with the pagination option.

Hope this article is useful to iOS BOX API users.
Feel free to comment in case of any queries/concerns.