SlideShare une entreprise Scribd logo
1  sur  80
Rails + iOS with RestKit
@andrewculver
The Evolution of iOS Tools
Before iCloud
After iCloud
Syncing is ... hard?
Keep it simple.
Topics
• Rails API Versioning
• RestKit Installation
• Mapping Configuration
• Pulling and Pushing Data
• Offline Mode and Other Syncing
• Authentication
Goals
• Understand some basics.
• Keep it as simple as possible.
Our Example App
“ClipQueue”
“ClipQueue”
• Helps with workflow automation.
• Detects content in the clipboard.
• Prompts to save it as a “Clip”, categorize it.
• Server processes it.
• Dispatches webhooks, sends emails, etc.
Rails JSON API
Rails JSON API
• Keep your API separate from your core app.
• Doing this efficiently requires thin controllers.
• Creating resources to represent actions that would
otherwise be custom controller actions helps, too.
class Clip < ActiveRecord::Base
attr_accessible :content, :created_at
end
Clip Model
Clipqueue::Application.routes.draw do
namespace :api do
namespace :v1 do
resources :clips
end
end
end
Setting up a Router
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
end
API Controller
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
def index
respond_with @clips
end
...
end
API Controller Actions
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
def show
respond_with @clip
end
...
end
API Controller Actions
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
def create
@clip.save
redirect_to [:api, :v1, @clip]
end
...
end
API Controller Actions
class Ability
include CanCan::Ability
// Guest users can do anything.
def initialize(user)
user ||= User.new
can :manage, :all
end
end
Single User System
RestKit Installation
Installation
• Use CocoaPods.
• This tutorial includes great installation steps for
new projects.
• https://github.com/RestKit/RKGist/blob/master/
TUTORIAL.md
Rails API Versioning
Rails JSON API Versioning
• If your API changes, older apps will crash.
• Your ranking in the App Store will crash, too.
• Does anyone have a Gem they use for this?
• Maintaining old versions of your API is easy:
• Make a separate copy for each new version.
$ cp -R v1/ v2/
Setting up a Router
Clipqueue::Application.routes.draw do
namespace :api do
namespace :v1 do
resources :clips
end
namespace :v2 do
resources :clips
resources :categories
end
end
end
Setting up a Router
Pulling Data
RESTKit ‘GET’ Lifecycle
• Issues HTTP GET request for URL.
• Receives XML/JSON response.
• Converts to NSDictionary + NSArray structure.
• Matches response URL to defined entity mapping.
• Maps response data to entity.
RKEntityMapping *clipMapping = [RKEntityMapping
mappingForEntityForName: @"Clip"
inManagedObjectStore: managedObjectStore];
[clipMapping addAttributeMappingsFromDictionary:@{
@"id": @"clipId",
@"content": @"content",
@"created_at": @"createdAt"}];
A Mapping
RKResponseDescriptor *clipsResponseDescriptor =
[RKResponseDescriptor
responseDescriptorWithMapping: clipMapping
pathPattern: @"/api/v1/clips"
keyPath: nil
statusCodes: RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:clipsResponseDescriptor];
‘Index’ Response Descriptor
RKResponseDescriptor *clipResponseDescriptor =
[RKResponseDescriptor
responseDescriptorWithMapping: clipMapping
pathPattern: @"/api/v1/clips/:id"
keyPath: nil
statusCodes: RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:clipResponseDescriptor];
‘Show’ Response Descriptor
- (void)loadClips
{
[[RKObjectManager sharedManager]
getObjectsAtPath:@"/api/v1/clips"
parameters:nil
success:nil
failure:nil];
}
Fetching Objects
(UITableViewController)
- (void)loadClips
{
[[RKObjectManager sharedManager]
getObjectsAtPath:@"/api/v1/clips"
parameters:nil
success:
^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}
failure:
^(RKObjectRequestOperation *operation, NSError *error) {}
];
}
Fetching Objects
(UITableViewController)
The View
• How does this information get to the user?
• A NSFetchedResultsController is handling the heavy
lifting.
Pull to Refresh
// In your UITableViewController.
UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl
addTarget:self
action:@selector(loadClips)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
Adding Pull to Refresh
(UITableViewController)
Pushing Data
RESTKit ‘POST’ Lifecycle
• Issues HTTP POST request to URL.
• Rails creates the object and redirects to it.
• From here it’s the same as before:
• Receives XML/JSON response.
• Converts to NSDictionary + NSArray structure.
• Matches redirected URL to defined entity mapping.
• Maps response data to entity.
Clip *clip = (Clip *)[NSEntityDescription
insertNewObjectForEntityForName:@"Clip"
inManagedObjectContext:self.managedObjectContext];
clip.content = [[UIPasteboard generalPasteboard] string];
Creating a New Clip
[[RKObjectManager sharedManager] postObject:clip
path:@"/api/v1/clips"
parameters:nil
success:nil
failure:nil];
Posting a New Clip
[[RKObjectManager sharedManager] postObject:clip
path:@"/api/v1/clips"
parameters:nil
success:
^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}
failure:
^(RKObjectRequestOperation *operation, NSError *error) {}
];
Posting a New Clip
RKRequestDescriptor *newClipRequestDescriptor =
[RKRequestDescriptor
requestDescriptorWithMapping:[clipMapping inverseMapping]
objectClass:[Clip class]
rootKeyPath:@"clip"];
[objectManager addRequestDescriptor:newClipRequestDescriptor];
A Request Descriptor
Mass-Assignment
• Rails’ new mass-assignment defaults are good, but
they cause issues for us here.
• RESTKit sends the ‘id’ and ‘created_at’ attributes
across in the request.
• This triggers an exception in development by default,
because of this:
config.active_record.mass_assignment_sanitizer = :strict
Offline Mode
Offline Mode
• The server is the authority, but is not always
available.
• We want to be able to work and save data locally even
in the absence of an Internet connection.
• We don’t want to lose our work.
• When a connection is available, we’d like our local
work to be pushed up to the server.
A VerySimple Example
• In this app, “Clips” are read-only.
• Don’t have to worry about resolving conflicting
changes from two sources.
• How simple a solution can you get away with?
A VerySimple Solution
• Try saving to the server.
• If that doesn’t work, just save it locally.
• It won’t have a “Clip ID”, but that doesn’t matter
for CoreData, even with relationships.
• When a connection becomes available, push it up.
A VerySimple Solution
• Try saving to the server.
• If that doesn’t work, just save it locally.
• It won’t have a “Clip ID”, but that doesn’t matter
for CoreData, even with relationships.
• When a connection becomes available:
• Push it up to the server.
• Claim our shiny new “Clip ID”.
A VerySimple Solution
• The only question is, how will the new ID get mapped
to the locally stored object?
• It can’t be matched by primary key ID, because it
didn’t have one locally.
• We’ll use a globally unique ID.
NSString *dataBaseString = [RKApplicationDataDirectory()
stringByAppendingPathComponent:@"ClipQueue.sqlite"];
NSPersistentStore __unused *persistentStore =
[managedObjectStore
addSQLitePersistentStoreAtPath:dataBaseString
fromSeedDatabaseAtPath:nil
withConfiguration:nil
options:nil
error:nil];
Adding Local Storage
RKEntityMapping *clipMapping = [RKEntityMapping
mappingForEntityForName: @"Clip"
inManagedObjectStore: managedObjectStore];
[clipMapping addAttributeMappingsFromDictionary:@{
@"id": @"clipId",
@"content": @"content",
@"uuid": @"uuid",
@"created_at": @"createdAt",
@"deleted_at": @"deletedAt"}];
clipMapping.identificationAttributes = @[ @"uuid" ];
An Improved Mapping
clip.uuid = [self getUUID];
[[RKObjectManager sharedManager] postObject:clip
path:@"/api/v1/clips" parameters:nil
success: ^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}
failure: ^(RKObjectRequestOperation *operation, NSError *error) {
NSError *localError = nil;
if (![self.managedObjectContext save:&localError]) {
// Show UIAlertView to user.
[self showErrorAlert:[localError localizedDescription]];
}
}];
Queuing Up Locally
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Clip"
inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"clipId == 0"];
[request setPredicate:predicate];
...
for (Clip *clip in mutableFetchResults) {
[[RKObjectManager sharedManager] postObject:clip path:@"/api/v1/clips"
parameters:nil success:nil failure: nil];
}
Syncing Up
class Clip < ActiveRecord::Base
...
before_validation do
self.uuid = UUIDTools::UUID.random_create.to_s if uuid.nil?
end
end
Updating API Logic
Sync Friendly Deletes
Sync Friendly Deletes
• An object exists locally, but not on the server.
• Was it created locally or deleted remotely?
• An object exists remotely, but not locally.
• Was it created remotely or deleted locally?
• Let’s look at a really easy way to deal with this.
class Clip < ActiveRecord::Base
...
scope :not_deleted, where('deleted_at IS NULL')
def destroy
self.update_column(:deleted_at, Time.zone.now)
end
end
Soft Delete
- (NSFetchedResultsController *)fetchedResultsController
{
...
// Filter out deleted results.
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"deletedAt == nil"];
[fetchRequest setPredicate:predicate];
...
}
Filtering Deleted Items
Added Bonus
• NSFetchedResultsController makes this an other UI
updates really pleasant to the user by default, even
when they’re triggered by results from the server.
Authentication
Authentication Goals
• Require username and password.
• Scope all data by user.
Authentication
• Prompt for credentials.
• Store them in iOS Keychain.
• Delay loading until credentials are provided.
• Configure the credentials for RestKit.
• Implement data scoping on the server based on the
session.
Devise.setup do |config|
...
config.http_authenticatable = true
...
end
HTTP Authentication
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if ([self shouldDisplayLoginModal]) {
[self performSegueWithIdentifier:@"ShowLogin" sender:self];
}
}
Show Sign-In Modal
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (![self shouldDisplayLoginModal]) {
[self loadObjectsFromDataStore];
}
}
Delay Loading
RKObjectManager* objectManager = [RKObjectManager sharedManager];
objectManager.client.username = emailAddressField.text;
objectManager.client.password = passwordField.text;
Configure Credentials
Add User-Clips Relationship
• Add “user_id” attribute to Clip.
• Add “has_one :user” relationship to Clip.
• Add “has_many :clips” relationship to User.
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.persisted?
can :manage, :clip, {user_id: user.id}
end
end
end
HTTP Authentication
class Api::V1::ClipsController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource :clip, through: current_user
...
end
Scoping Controller Results
What We’ve Covered
• Rails API Versioning
• RestKit Installation
• Mapping Configuration
• Pulling and Pushing Data
• Offline Mode and Other Syncing
• Authentication
Goals
• Understand some basics.
• Keep it as simple as possible.
Additional Resources
Blake Watters’ RESTKit 0.20.0 “Gist” Tutorial
https://github.com/RestKit/RKGist/blob/master/TUTORIAL.md
(A work in progress.)
Thanks! Questions?
@andrewculver
Rails and iOS with RestKit

Contenu connexe

Tendances

React Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + AuthenticationReact Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + AuthenticationKobkrit Viriyayudhakorn
 
Containerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS LambdaContainerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS LambdaRyan Cuprak
 
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)Ryan Cuprak
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformAntonio Peric-Mazar
 
06 integrate elasticsearch
06 integrate elasticsearch06 integrate elasticsearch
06 integrate elasticsearchErhwen Kuo
 
Mcknight well built extensions
Mcknight well built extensionsMcknight well built extensions
Mcknight well built extensionsRichard McKnight
 
spray: REST on Akka
spray: REST on Akkaspray: REST on Akka
spray: REST on Akkasirthias
 
04 integrate entityframework
04 integrate entityframework04 integrate entityframework
04 integrate entityframeworkErhwen Kuo
 
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBoxKobkrit Viriyayudhakorn
 
2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastoreikailan
 
05 integrate redis
05 integrate redis05 integrate redis
05 integrate redisErhwen Kuo
 
2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauthikailan
 
Angular Owin Katana TypeScript
Angular Owin Katana TypeScriptAngular Owin Katana TypeScript
Angular Owin Katana TypeScriptJustin Wendlandt
 
Why we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukWhy we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukGraham Tackley
 
What is App Engine? O
What is App Engine? OWhat is App Engine? O
What is App Engine? Oikailan
 
Advanced Container Management and Scheduling
Advanced Container Management and SchedulingAdvanced Container Management and Scheduling
Advanced Container Management and SchedulingAmazon Web Services
 

Tendances (20)

React Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + AuthenticationReact Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + Authentication
 
Deep Dive into AWS Fargate
Deep Dive into AWS FargateDeep Dive into AWS Fargate
Deep Dive into AWS Fargate
 
Containerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS LambdaContainerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS Lambda
 
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API Platform
 
06 integrate elasticsearch
06 integrate elasticsearch06 integrate elasticsearch
06 integrate elasticsearch
 
Mcknight well built extensions
Mcknight well built extensionsMcknight well built extensions
Mcknight well built extensions
 
Deep dive into AWS fargate
Deep dive into AWS fargateDeep dive into AWS fargate
Deep dive into AWS fargate
 
spray: REST on Akka
spray: REST on Akkaspray: REST on Akka
spray: REST on Akka
 
Amazon ECS Deep Dive
Amazon ECS Deep DiveAmazon ECS Deep Dive
Amazon ECS Deep Dive
 
04 integrate entityframework
04 integrate entityframework04 integrate entityframework
04 integrate entityframework
 
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
 
Docker and java
Docker and javaDocker and java
Docker and java
 
2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore
 
05 integrate redis
05 integrate redis05 integrate redis
05 integrate redis
 
2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth
 
Angular Owin Katana TypeScript
Angular Owin Katana TypeScriptAngular Owin Katana TypeScript
Angular Owin Katana TypeScript
 
Why we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukWhy we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.uk
 
What is App Engine? O
What is App Engine? OWhat is App Engine? O
What is App Engine? O
 
Advanced Container Management and Scheduling
Advanced Container Management and SchedulingAdvanced Container Management and Scheduling
Advanced Container Management and Scheduling
 

Similaire à Rails and iOS with RestKit

SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...Liam Cleary [MVP]
 
SQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 QuestionsSQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 QuestionsMike Broberg
 
RESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVCRESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVCbnoyle
 
Esri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc FinalEsri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc Finalguestcd4688
 
AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)Igor Talevski
 
e-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud Visione-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud VisionImre Nagi
 
Medium TechTalk — iOS
Medium TechTalk — iOSMedium TechTalk — iOS
Medium TechTalk — iOSjimmyatmedium
 
Rails in the Cloud
Rails in the CloudRails in the Cloud
Rails in the Cloudiwarshak
 
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»DataArt
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responsesdarrelmiller71
 
Icinga 2009 at OSMC
Icinga 2009 at OSMCIcinga 2009 at OSMC
Icinga 2009 at OSMCIcinga
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentationAlan Hietala
 
ASP .Net Core SPA Templates
ASP .Net Core SPA TemplatesASP .Net Core SPA Templates
ASP .Net Core SPA TemplatesEamonn Boyle
 
Elements for an iOS Backend
Elements for an iOS BackendElements for an iOS Backend
Elements for an iOS BackendLaurent Cerveau
 
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...SPTechCon
 
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...smn-automate
 
NoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSONNoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSONMario Beck
 
Itb 2021 - Bulding Quick APIs by Gavin Pickin
Itb 2021 - Bulding Quick APIs by Gavin PickinItb 2021 - Bulding Quick APIs by Gavin Pickin
Itb 2021 - Bulding Quick APIs by Gavin PickinGavin Pickin
 

Similaire à Rails and iOS with RestKit (20)

SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...
 
SQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 QuestionsSQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 Questions
 
RESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVCRESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVC
 
Esri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc FinalEsri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc Final
 
AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)
 
e-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud Visione-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
 
Medium TechTalk — iOS
Medium TechTalk — iOSMedium TechTalk — iOS
Medium TechTalk — iOS
 
Rails in the Cloud
Rails in the CloudRails in the Cloud
Rails in the Cloud
 
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
 
Icinga 2009 at OSMC
Icinga 2009 at OSMCIcinga 2009 at OSMC
Icinga 2009 at OSMC
 
Real World MVC
Real World MVCReal World MVC
Real World MVC
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentation
 
ASP .Net Core SPA Templates
ASP .Net Core SPA TemplatesASP .Net Core SPA Templates
ASP .Net Core SPA Templates
 
Elements for an iOS Backend
Elements for an iOS BackendElements for an iOS Backend
Elements for an iOS Backend
 
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
 
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
 
NoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSONNoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSON
 
Itb 2021 - Bulding Quick APIs by Gavin Pickin
Itb 2021 - Bulding Quick APIs by Gavin PickinItb 2021 - Bulding Quick APIs by Gavin Pickin
Itb 2021 - Bulding Quick APIs by Gavin Pickin
 

Dernier

Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMKumar Satyam
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)Samir Dash
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard37
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 

Dernier (20)

Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 

Rails and iOS with RestKit