SlideShare a Scribd company logo
Chainable
Data Sources
or how I stopped worrying and
started abusing table view updates
Amadour Griffais
CocoaHeads Paris – 8 September 2016
@ * [ : ] ;
Disclaimer
🍓
UITableView *tableView;
- (UITableViewCell*) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell = [tableView
dequeueReusableCellWithIdentifier:@"fruit-cell"
forIndexPath:indexPath];
Fruit* fruit = self.fruits[0];
cell.titleLabel.text = fruit.name;
return cell;
}
😎
Animations 😍
[tableView beginUpdates];
[self.fruits removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];
//Controller
- (UITableViewCell*) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell = [tableView
dequeueReusableCellWithIdentifier:@"fruit-cell"
forIndexPath:indexPath];
Fruit* fruit = self.fruits[0]; //Model
cell.titleLabel.text = fruit.name; //View
return cell;
}
🤓
- (UITableViewCell*) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
FruitCell* cell = (FruitCell*)[tableView
dequeueReusableCellWithIdentifier:@"fruit-cell"
forIndexPath:indexPath];
cell.fruit = fruit;
return cell;
}
🤔
- (UITableViewCell*) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == FRUIT_SECTION) {
UITableViewCell* cell = [tableView
dequeueReusableCellWithIdentifier:@"fruit-cell"
forIndexPath:indexPath];
Fruit* fruit = self.fruits[0];
cell.titleLabel.text = fruit.name;
return cell;
} else if (indexPath.section == VEGETABLE_SECTION) {
UITableViewCell* cell = [tableView
dequeueReusableCellWithIdentifier:@"veg-cell"
forIndexPath:indexPath];
...
😒
- (UITableViewCell*) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.section) {
case FRUIT_SECTION: {
UITableViewCell* cell = [tableView
dequeueReusableCellWithIdentifier:@"fruit-cell"
forIndexPath:indexPath];
Fruit* fruit = self.fruits[0];
cell.titleLabel.text = fruit.name;
return cell;
} break;
case VEGETABLE_SECTION: {
...
😟
- (UITableViewCell*) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == AD_SECTION &&
indexPath.row == AD_ROW) {
return [tableView
dequeueReusableCellWithIdentifier:@"ad-cell"
forIndexPath:indexPath];
}
indexPath = [self offsetIndexPath:indexPath
ifAfter:AD_INDEX_PATH];
switch (indexPath.section) {
case FRUIT_SECTION: {
UITableViewCell* cell = [tableView
dequeueReusableCellWithIdentifier:@"fruit-cell"
forIndexPath:indexPath];
...
😨
- (UITableViewCell*) tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == AD_SECTION &&
indexPath.row == AD_ROW &&
self.isAdLoaded) {
return [tableView
dequeueReusableCellWithIdentifier:@"ad-cell"
forIndexPath:indexPath];
}
indexPath = [self offsetIndexPath:indexPath
ifAfter:AD_INDEX_PATH];
switch (indexPath.section) {
case FRUIT_SECTION: {
UITableViewCell* cell = [tableView
dequeueReusableCellWithIdentifier:@"fruit-cell"
forIndexPath:indexPath];
...
😰
Animations 😱
2016-09-06 14:07:23.167 MyBeautifulTableView[89346:883532] *** Terminating app due to
uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid
number of rows in section 0. The number of rows contained in an existing section after the
update (1) must be equal to the number of rows contained in that section before the update
(9), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0
deleted) and plus or minus the number of rows moved into or out of that section (0 moved
in, 0 moved out).'
*** First throw call stack:
(
0 CoreFoundation 0x000000010eba034b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010e60121e objc_exception_throw + 48
2 CoreFoundation 0x000000010eba4442 +[NSException
raise:format:arguments:] + 98
3 Foundation 0x0000000109620edd -[NSAssertionHandler
handleFailureInMethod:object:file:lineNumber:description:] + 195
4 UIKit 0x000000010c2172f4 -[UITableView
_endCellAnimationsWithContext:] + 17558
...
[tableView reloadData];
😢
Chainable datasource
UITableViewDataSource
UITableViewDataSource
🍓 🍆
💵
M
C
V
UITableViewDataSource
💩
🍓 🍆
💵
M
C
V
MCV
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
🍓
🍆
+
💵
<
ChainableDataSource
@protocol ChainableDataSource <NSObject>
- (NSInteger) numberOfSectionsInDataSource;
- (NSInteger) numberOfObjectsInDataSourceSection:(NSInteger)section;
- (id) dataSourceObjectAtIndexPath:(NSIndexPath*)indexPath;
- (NSString*) nameForDataSourceSectionAtIndex:(NSInteger)section;
@property (weak) id<ChainableDataSourceDelegate> dataSourceDelegate;
@end
🍓
🍆
💵
M
🍓
🍆
💵
M
NSArray (ChainableDataSource)
FetchedResultsDataSource
<#YourChainableDataSource#>
MCV
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
Chainable datasource
🍓
CellDataSource
🍓
CellDataSource
@interface CellDataSource : NSObject
<ChainableDataSource, UITableViewDataSource>
- (NSString*) cellIdentifierForObject:(id)object;
- (void) configureCell:(UIView<GenericCell>*)cell withObject:(id)object;
MCV
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
+
<
+
<
<#YourChainableDataSource#>
+
<
TransformDataSource
<#YourChainableDataSource#>
@interface TransformDataSource : NSObject <ChainableDataSource>
@property (nonatomic, copy) NSArray<id<ChainableDataSource>>* dataSources;
- (NSIndexPath*) sourceIndexPathForIndexPath:(NSIndexPath*)indexPath;
- (NSIndexPath*) indexPathForSourceIndexPath:(NSIndexPath*)sourceIndexPath
inDataSource:(id<ChainableDataSource>)sourceDataSource;
- (NSInteger) sectionIndexForSourceSectionIndex:(NSInteger)sourceSection
inDataSource:(id<ChainableDataSource>)sourceDataSource;
- (NSIndexPath*) sourceSectionIndexPathForSectionIndex:(NSInteger)section;
@end
+
<
TransformDataSource
<#YourChainableDataSource#>
+
TransformDataSource
<#YourChainableDataSource#>
ConcatenatedSectionsDataSource
<
TransformDataSource
<#YourChainableDataSource#>
ConcatenatedSectionsDataSource
InsertionDataSource
TransformDataSource
<#YourChainableDataSource#>
ConcatenatedSectionsDataSource
InsertionDataSource
🎉SwitchDataSource
FlattenedDataSource
FilterDataSource
PlaceholderDataSource
EmptySectionFilterDataSource
<#YourTransformDataSource#>
Updates
MCV
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
ChainableDataSourceDelegate
@protocol ChainableDataSourceDelegate <NSObject>
- (void) dataSourceDidReload:(id<ChainableDataSource>)dataSource;
- (void) dataSourceWillUpdate:(id<ChainableDataSource>)dataSource;
- (void) dataSourceDidUpdate:(id<ChainableDataSource>)dataSource;
- (void) dataSource:(id<ChainableDataSource>)dataSource
didDeleteSectionsAtIndexes:(NSIndexSet*)sectionIndexes;
- (void) dataSource:(id<ChainableDataSource>)dataSource
didInsertSectionsAtIndexes:(NSIndexSet*)sectionIndexes;
- (void) dataSource:(id<ChainableDataSource>)dataSource
didDeleteObjectsAtIndexPaths:(NSArray<NSIndexPath*>*)indexPath;
- (void) dataSource:(id<ChainableDataSource>)dataSource
didInsertObjectsAtIndexPaths:(NSArray<NSIndexPath*>*)indexPath;
- (void) dataSource:(id<ChainableDataSource>)dataSource
didUpdateObjectsAtIndexPaths:(NSArray<NSIndexPath*>*)indexPath;
@end
A
B
E
D
C
F
A
C
H
D
G
The truth about updates
A
B
E
D
C
F
A
C
H
D
G
The truth about updates
delete: 1, 4, 5 insert: 2, 4
A
B
E
D
C
F
A
C
H
D
G
The truth about updates
update: 1
[tableView beginUpdates];
[self.fruits removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];
//OK
The truth about updates
[tableView beginUpdates];
[self.fruits removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];
//Still OK
The truth about updates
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
ChainableDataSourceDelegate
🍓
🍓
🍆
🍓
💵
🍆
UITableView <ChainableDataSourceDelegate>
UICollectionView <ChainableDataSourceDelegate>
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
ChainableDataSourceDelegate
CellDataSource
didUpdateObjectsAtIndexPaths -> configureCell:withObject:
everything else -> forward
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
ChainableDataSourceDelegate
🍓
🍆
💵
<#YourChainableDataSource#>
FetchedResultsDatasource
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
ChainableDataSourceDelegate
+
<
basic mapping -> automatic
TransformDataSource
TransformDataSource
advanced mapping:
tweak update set pre and post upstream updates
- (void) preRefreshTranslateSourceUpdateCache:(UpdateCache*)sourceUpdateCache
fromDataSource:(id<ChainableDataSource>)dataSource
toUpdateCache:(UpdateCache*)updateCache;
- (void) postRefreshTranslateSourceUpdateCache:(UpdateCache*)sourceUpdateCache
fromDataSource:(id<ChainableDataSource>)dataSource
toUpdateCache:(UpdateCache*)updateCache;
🍓
🍓
🍓
🍓
🍓
🍓
🍓
dataSourceDidReload
🍓
🍓
🍓
🍓
🍓
🍓
🍓
dataSourceDidReload
dataSourceDidReload
(reloadData - 😥 )
🍓Δ
🍓
🍓
🍓
🍓
🍓
🍓
DeltaUpdateDataSource
dataSourceDidReload
A
B
E
D
C
F
A
C
H
D
G
A
B
E
D
C
F
A
C
H
D
G
- = ?
A
B
E
D
C
F
A
C
H
D
G
delete: 1, 4, 5 insert: 2, 4
diff algorithm
Longest Common Subsequence
🍓Δ
🍓
🍓
🍓
🍓
🍓
🍓
DeltaUpdateDataSource
dataSourceDidReload
🍓Δ
🍓
🍓
🍓
🍓
🍓
🍓
DeltaUpdateDataSource
dataSourceDidReload
dataSourceWillUpdate
dataSource…∆
dataSourceDidUpdate😁
Updates
//TODO: Nothing
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
CellDataSource
CellDataSource
- (NSString*) cellIdentifierForObject:(id)object
{
return NSStringFromClass([object class]);
}
- (void) configureCell:(UITableViewCell*)cell withObject:(id)object
{
if ([cell.reuseIdentifier isEqual:@"Fruit"]) {
//...
} else if ([cell.reuseIdentifier isEqual:@"Vegetable"]) {
//...
}
// 😢
}
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
CellDataSource
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
CellDataSource:
alternative approach
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
TransformDataSource (CellDataSource)
forward delegate/data source methods
based on index mapping
TransformDataSource (CellDataSource)
forward delegate/data source methods
based on index mapping
(My dirty secret)
- (void) forwardInvocation:(NSInvocation *)anInvocation
{
if ([self isForwardableDelegateSelector:anInvocation.selector]) {
NSMethodSignature* signature = anInvocation.methodSignature;
NSArray* components = [NSStringFromSelector(anInvocation.selector)componentsSeparatedByString:@":"];
for (NSInteger argIndex = 0; argIndex < signature.numberOfArguments; argIndex++) {
//skip self and cmd
if (argIndex < 2) {
continue;
}
//won't work with targetIndexPathForMoveFromRowAtIndexPath, since two indexPath are present
const char* argType = [signature getArgumentTypeAtIndex:argIndex];
if (strcmp(argType, @encode(NSIndexPath*)) == 0) {
__unsafe_unretained id arg;
[anInvocation getArgument:&arg atIndex:argIndex];
if ([arg isKindOfClass:[NSIndexPath class]]) {
NSIndexPath* indexPath = arg;
NSIndexPath* fullIndexPath = [self sourceIndexPathForIndexPath:indexPath];
id<ChainableDataSource> dataSource = self.dataSources[[fullIndexPath indexAtPosition:0]];
NSIndexPath* dsIndexPath = [NSIndexPath indexPathForRow:[fullIndexPath indexAtPosition:2] inSection:
[fullIndexPath indexAtPosition:1]];
[anInvocation setArgument:&dsIndexPath atIndex:argIndex];
if ([dataSource respondsToSelector:anInvocation.selector]) {
[anInvocation invokeWithTarget:dataSource];
}
return;
}
} else if (strcmp(argType, @encode(NSInteger)) == 0 && [components[argIndex-2] hasSuffix:@"Section"]) {
NSInteger section;
[anInvocation getArgument:&section atIndex:argIndex];
NSIndexPath* sourceSectionIndexPath = [self sourceSectionIndexPathForSectionIndex:section];
if (sourceSectionIndexPath) {
id<ChainableDataSource> dataSource = self.dataSources[[sourceSectionIndexPath indexAtPosition:0]];
NSInteger sourceSection = [sourceSectionIndexPath indexAtPosition:1];
[anInvocation setArgument:&sourceSection atIndex:argIndex];
if ([dataSource respondsToSelector:anInvocation.selector]) {
[anInvocation invokeWithTarget:dataSource];
}
}
return;
}
}
return;
}
return [super forwardInvocation:anInvocation];
}
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
CellDataSource
@implementation FruitCellDataSource
- (NSString*) cellIdentifierForObject:(id)object
{
return @"fruit-cell";
}
- (void) configureCell:(UITableViewCell*)cell withObject:(id)object
{
Fruit* fruit = object;
cell.titleLabel.text = fruit.name;
}
- (void) tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Fruit* fruit = [self.objectsDataSource
dataSourceObjectAtIndexPath:indexPath];
//...
}
@end
🍓
🍆
+
💵
<
🍓
🍓
🍆
🍓
💵
🍆
It’s alive!
Demo
Open source*
*before this holiday season
Open source*
?
amadour

More Related Content

What's hot

Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCsStandford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
彼得潘 Pan
 
CocoaHeads Toulouse - Guillaume Cerquant - UIView
CocoaHeads Toulouse - Guillaume Cerquant - UIViewCocoaHeads Toulouse - Guillaume Cerquant - UIView
CocoaHeads Toulouse - Guillaume Cerquant - UIView
CocoaHeads France
 
描画とビジネスをクリーンに分ける(公開用)
描画とビジネスをクリーンに分ける(公開用)描画とビジネスをクリーンに分ける(公開用)
描画とビジネスをクリーンに分ける(公開用)
Kenji Tanaka
 
Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019
DanielJalkut
 
Workshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptWorkshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScript
Visual Engineering
 
Unit testing UIView
Unit testing UIViewUnit testing UIView
Unit testing UIView
Pierre Felgines
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0
Eyal Vardi
 
Performance Optimization In Angular 2
Performance Optimization In Angular 2Performance Optimization In Angular 2
Performance Optimization In Angular 2
Eyal Vardi
 
Angular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time CompilationAngular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time Compilation
Eyal Vardi
 
Routing And Navigation
Routing And NavigationRouting And Navigation
Routing And Navigation
Eyal Vardi
 
AngularJS Compile Process
AngularJS Compile ProcessAngularJS Compile Process
AngularJS Compile Process
Eyal Vardi
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscore
Nicolas Carlo
 
How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND
Enrique Oriol Bermúdez
 
Es6 good parts
Es6 good partsEs6 good parts
UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기
NAVER SHOPPING
 
Cyclejs introduction
Cyclejs introductionCyclejs introduction
Cyclejs introduction
Arye Lukashevski
 
mobl
moblmobl
mobl
zefhemel
 
GHC Participant Training
GHC Participant TrainingGHC Participant Training
GHC Participant Training
AidIQ
 
How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014
Guillaume POTIER
 
Webapps without the web
Webapps without the webWebapps without the web
Webapps without the web
Remy Sharp
 

What's hot (20)

Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCsStandford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
 
CocoaHeads Toulouse - Guillaume Cerquant - UIView
CocoaHeads Toulouse - Guillaume Cerquant - UIViewCocoaHeads Toulouse - Guillaume Cerquant - UIView
CocoaHeads Toulouse - Guillaume Cerquant - UIView
 
描画とビジネスをクリーンに分ける(公開用)
描画とビジネスをクリーンに分ける(公開用)描画とビジネスをクリーンに分ける(公開用)
描画とビジネスをクリーンに分ける(公開用)
 
Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019Daniel Jalkut - dotSwift 2019
Daniel Jalkut - dotSwift 2019
 
Workshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptWorkshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScript
 
Unit testing UIView
Unit testing UIViewUnit testing UIView
Unit testing UIView
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0
 
Performance Optimization In Angular 2
Performance Optimization In Angular 2Performance Optimization In Angular 2
Performance Optimization In Angular 2
 
Angular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time CompilationAngular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time Compilation
 
Routing And Navigation
Routing And NavigationRouting And Navigation
Routing And Navigation
 
AngularJS Compile Process
AngularJS Compile ProcessAngularJS Compile Process
AngularJS Compile Process
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscore
 
How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND How to build an AngularJS backend-ready app WITHOUT BACKEND
How to build an AngularJS backend-ready app WITHOUT BACKEND
 
Es6 good parts
Es6 good partsEs6 good parts
Es6 good parts
 
UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기
 
Cyclejs introduction
Cyclejs introductionCyclejs introduction
Cyclejs introduction
 
mobl
moblmobl
mobl
 
GHC Participant Training
GHC Participant TrainingGHC Participant Training
GHC Participant Training
 
How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014
 
Webapps without the web
Webapps without the webWebapps without the web
Webapps without the web
 

Viewers also liked

La sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de BockLa sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de Bock
Nicolas Lourenço
 
MVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire LhotelierMVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire Lhotelier
CocoaHeads France
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
CocoaHeads France
 
J'ai fait une app native en React Native
J'ai fait une app native en React NativeJ'ai fait une app native en React Native
J'ai fait une app native en React Native
CocoaHeads France
 
Rebranding an ios application
Rebranding an ios applicationRebranding an ios application
Rebranding an ios application
CocoaHeads France
 
Alamofire
AlamofireAlamofire
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
CocoaHeads France
 
Handle the error
Handle the errorHandle the error
Handle the error
CocoaHeads France
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
CocoaHeads France
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
CocoaHeads France
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
CocoaHeads France
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
CocoaHeads France
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
CocoaHeads France
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
CocoaHeads France
 
Monads in Swift
Monads in SwiftMonads in Swift
Monads in Swift
Vincent Pradeilles
 
CloudKit as a backend
CloudKit as a backendCloudKit as a backend
CloudKit as a backend
CocoaHeads France
 
Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?
CocoaHeads France
 
BitTorrent on iOS
BitTorrent on iOSBitTorrent on iOS
BitTorrent on iOS
CocoaHeads France
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
CocoaHeads France
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
CocoaHeads France
 

Viewers also liked (20)

La sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de BockLa sécurité sur iOS par Arnaud de Bock
La sécurité sur iOS par Arnaud de Bock
 
MVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire LhotelierMVC-RS par Grégoire Lhotelier
MVC-RS par Grégoire Lhotelier
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
 
J'ai fait une app native en React Native
J'ai fait une app native en React NativeJ'ai fait une app native en React Native
J'ai fait une app native en React Native
 
Rebranding an ios application
Rebranding an ios applicationRebranding an ios application
Rebranding an ios application
 
Alamofire
AlamofireAlamofire
Alamofire
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
 
Handle the error
Handle the errorHandle the error
Handle the error
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
 
Monads in Swift
Monads in SwiftMonads in Swift
Monads in Swift
 
CloudKit as a backend
CloudKit as a backendCloudKit as a backend
CloudKit as a backend
 
Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?
 
BitTorrent on iOS
BitTorrent on iOSBitTorrent on iOS
BitTorrent on iOS
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 

Similar to Chainable datasource

201104 iphone navigation-based apps
201104 iphone navigation-based apps201104 iphone navigation-based apps
201104 iphone navigation-based apps
Javier Gonzalez-Sanchez
 
I os 04
I os 04I os 04
I os 04
信嘉 陳
 
I os 11
I os 11I os 11
I os 11
信嘉 陳
 
004
004004
FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.
UA Mobile
 
So I already have most of the code and now I have to1. create an .pdf
So I already have most of the code and now I have to1. create an .pdfSo I already have most of the code and now I have to1. create an .pdf
So I already have most of the code and now I have to1. create an .pdf
arjuncollection
 
Optimize CollectionView Scrolling
Optimize CollectionView ScrollingOptimize CollectionView Scrolling
Optimize CollectionView Scrolling
Andrea Prearo
 
Django quickstart
Django quickstartDjango quickstart
Django quickstart
Marconi Moreto
 
A multi submission importer for easyform
A multi submission importer for easyformA multi submission importer for easyform
A multi submission importer for easyform
Annette Lewis
 
занятие7
занятие7занятие7
занятие7
Oleg Parinov
 
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV) Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Mobivery
 
Your Second iPhone App - Code Listings
Your Second iPhone App - Code ListingsYour Second iPhone App - Code Listings
Your Second iPhone App - Code Listings
Vu Tran Lam
 
Smooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionViewSmooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionView
Andrea Prearo
 
Swift Tableview iOS App Development
Swift Tableview iOS App DevelopmentSwift Tableview iOS App Development
Swift Tableview iOS App Development
Ketan Raval
 
Oops lab manual2
Oops lab manual2Oops lab manual2
Oops lab manual2
Mouna Guru
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven Development
Nuvole
 
20180721 code defragment
20180721 code defragment20180721 code defragment
20180721 code defragment
Chiwon Song
 
ITT 2014 - Chris Eidhof - Practical Concurrent Programming
ITT 2014 - Chris Eidhof - Practical Concurrent ProgrammingITT 2014 - Chris Eidhof - Practical Concurrent Programming
ITT 2014 - Chris Eidhof - Practical Concurrent Programming
Istanbul Tech Talks
 
Apple Templates Considered Harmful
Apple Templates Considered HarmfulApple Templates Considered Harmful
Apple Templates Considered Harmful
Brian Gesiak
 
How to build a debug view almost for free
How to build a debug view almost for freeHow to build a debug view almost for free
How to build a debug view almost for free
Vincent Pradeilles
 

Similar to Chainable datasource (20)

201104 iphone navigation-based apps
201104 iphone navigation-based apps201104 iphone navigation-based apps
201104 iphone navigation-based apps
 
I os 04
I os 04I os 04
I os 04
 
I os 11
I os 11I os 11
I os 11
 
004
004004
004
 
FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.
 
So I already have most of the code and now I have to1. create an .pdf
So I already have most of the code and now I have to1. create an .pdfSo I already have most of the code and now I have to1. create an .pdf
So I already have most of the code and now I have to1. create an .pdf
 
Optimize CollectionView Scrolling
Optimize CollectionView ScrollingOptimize CollectionView Scrolling
Optimize CollectionView Scrolling
 
Django quickstart
Django quickstartDjango quickstart
Django quickstart
 
A multi submission importer for easyform
A multi submission importer for easyformA multi submission importer for easyform
A multi submission importer for easyform
 
занятие7
занятие7занятие7
занятие7
 
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV) Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
 
Your Second iPhone App - Code Listings
Your Second iPhone App - Code ListingsYour Second iPhone App - Code Listings
Your Second iPhone App - Code Listings
 
Smooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionViewSmooth scrolling in UITableView and UICollectionView
Smooth scrolling in UITableView and UICollectionView
 
Swift Tableview iOS App Development
Swift Tableview iOS App DevelopmentSwift Tableview iOS App Development
Swift Tableview iOS App Development
 
Oops lab manual2
Oops lab manual2Oops lab manual2
Oops lab manual2
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven Development
 
20180721 code defragment
20180721 code defragment20180721 code defragment
20180721 code defragment
 
ITT 2014 - Chris Eidhof - Practical Concurrent Programming
ITT 2014 - Chris Eidhof - Practical Concurrent ProgrammingITT 2014 - Chris Eidhof - Practical Concurrent Programming
ITT 2014 - Chris Eidhof - Practical Concurrent Programming
 
Apple Templates Considered Harmful
Apple Templates Considered HarmfulApple Templates Considered Harmful
Apple Templates Considered Harmful
 
How to build a debug view almost for free
How to build a debug view almost for freeHow to build a debug view almost for free
How to build a debug view almost for free
 

More from CocoaHeads France

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
CocoaHeads France
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
CocoaHeads France
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
CocoaHeads France
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
CocoaHeads France
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
CocoaHeads France
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
CocoaHeads France
 
Super combinators
Super combinatorsSuper combinators
Super combinators
CocoaHeads France
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
CocoaHeads France
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
CocoaHeads France
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.
CocoaHeads France
 
Un retour d'expérience sur Apple Pay
Un retour d'expérience sur Apple PayUn retour d'expérience sur Apple Pay
Un retour d'expérience sur Apple Pay
CocoaHeads France
 
Firebase par nicolas lehovetzki
Firebase par nicolas lehovetzkiFirebase par nicolas lehovetzki
Firebase par nicolas lehovetzki
CocoaHeads France
 
Safari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa SqualliSafari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa Squalli
CocoaHeads France
 

More from CocoaHeads France (13)

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
 
Super combinators
Super combinatorsSuper combinators
Super combinators
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.
 
Un retour d'expérience sur Apple Pay
Un retour d'expérience sur Apple PayUn retour d'expérience sur Apple Pay
Un retour d'expérience sur Apple Pay
 
Firebase par nicolas lehovetzki
Firebase par nicolas lehovetzkiFirebase par nicolas lehovetzki
Firebase par nicolas lehovetzki
 
Safari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa SqualliSafari app extensions cleared up by Sanaa Squalli
Safari app extensions cleared up by Sanaa Squalli
 

Recently uploaded

Mobile App Development Company in Noida - Drona Infotech.
Mobile App Development Company in Noida - Drona Infotech.Mobile App Development Company in Noida - Drona Infotech.
Mobile App Development Company in Noida - Drona Infotech.
Mobile App Development Company in Noida - Drona Infotech
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
revolutionary575
 
Attendance Tracking From Paper To Digital
Attendance Tracking From Paper To DigitalAttendance Tracking From Paper To Digital
Attendance Tracking From Paper To Digital
Task Tracker
 
Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024
Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024
Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024
ThousandEyes
 
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptxWired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
SimonedeGijt
 
AI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdf
AI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdfAI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdf
AI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdf
Daniel Zivkovic
 
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in CityGirls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
neshakor5152
 
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
aslasdfmkhan4750
 
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docxComprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Aardwolf Security
 
bangalore Girls call 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
bangalore Girls call  👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Deliverybangalore Girls call  👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
bangalore Girls call 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
sunilverma7884
 
Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …
908dutch
 
GT degree offer diploma Transcript
GT degree offer diploma TranscriptGT degree offer diploma Transcript
GT degree offer diploma Transcript
attueb
 
IoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdf
IoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdfIoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdf
IoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdf
mohitd6
 
ERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in CoimbatoreERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in Coimbatore
Nextskill Technologies
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
dream girl
 
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
norina2645
 
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
rachitkumar09887
 
AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.
AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.
AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.
Srinivas Dukka
 
Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...
Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...
Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...
simran hot girls
 
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
OnePlan Solutions
 

Recently uploaded (20)

Mobile App Development Company in Noida - Drona Infotech.
Mobile App Development Company in Noida - Drona Infotech.Mobile App Development Company in Noida - Drona Infotech.
Mobile App Development Company in Noida - Drona Infotech.
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
 
Attendance Tracking From Paper To Digital
Attendance Tracking From Paper To DigitalAttendance Tracking From Paper To Digital
Attendance Tracking From Paper To Digital
 
Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024
Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024
Cisco Live Announcements: New ThousandEyes Release Highlights - July 2024
 
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptxWired_2.0_Create_AmsterdamJUG_09072024.pptx
Wired_2.0_Create_AmsterdamJUG_09072024.pptx
 
AI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdf
AI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdfAI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdf
AI - Your Startup Sidekick (Leveraging AI to Bootstrap a Lean Startup).pdf
 
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in CityGirls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
Girls Call Mysore 000XX00000 Provide Best And Top Girl Service And No1 in City
 
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
Independent Girls Call ServiCe Hyderabad 0000000000 Tanisha Best High Class H...
 
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docxComprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
Comprehensive Vulnerability Assessments Process _ Aardwolf Security.docx
 
bangalore Girls call 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
bangalore Girls call  👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Deliverybangalore Girls call  👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
bangalore Girls call 👀 XXXXXXXXXXX 👀 Rs.9.5 K Cash Payment With Room Delivery
 
Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …Prada Group Reports Strong Growth in First Quarter …
Prada Group Reports Strong Growth in First Quarter …
 
GT degree offer diploma Transcript
GT degree offer diploma TranscriptGT degree offer diploma Transcript
GT degree offer diploma Transcript
 
IoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdf
IoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdfIoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdf
IoT In Manufacturing_ Use Cases, Benefits, and Challenges.pdf
 
ERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in CoimbatoreERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in Coimbatore
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
 
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
 
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
 
AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.
AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.
AWS DevOps-Tutorial CHANAKYA SRIYAN DUKKA.
 
Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...
Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...
Girls Call Jogeshwari 9967584737 Provide Best And Top Girl Service And No1 in...
 
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
 

Chainable datasource