SlideShare ist ein Scribd-Unternehmen logo
1 von 140
Downloaden Sie, um offline zu lesen
Hello, ReactorKit! 👋
Suyeol Jeon https://github.com/devxoul
Jeon Suyeol
StyleShare Inc.
Open Source Lover
Then
URLNavigator
RxSwift
ObjectMapper
Why?
Why?
Massive View Controller
Why?
Massive View Controller
RxSwift State Managing
Massive View Controller
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html
Massive View Controller
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html
Massive View Controller
🙁
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html
RxSwift State Managing
Cyclic Data Dependencies
RxSwift State Managing
currentValue increaseValue()
RxSwift State Managing
currentValue increaseValue()
last state
RxSwift State Managing
currentValue increaseValue()
last state
result
RxSwift State Managing
Cyclic Data Dependencies
RxSwift State Managing
Cyclic Data Dependencies
Pagination
List operation
Value update
...
RxSwift State Managing
After a while...
RxSwift State Managing
After a while...
Variable<Int>
PublishSubject<Int>
PublishRelay<[Item]>
Variable<User>
BehaviorSubject<String>
Variable<String>
I wanted to...
1. Avoid Massive View Controller
I wanted to...
1. Avoid Massive View Controller
2. Take advantages of RxSwift
I wanted to...
1. Avoid Massive View Controller
2. Take advantages of RxSwift
3. Manage states gracefully
ReactorKit
ReactorKit can...
1. Avoid Massive View Controller ✅
ReactorKit can...
1. Avoid Massive View Controller ✅
Separates responsibilities of view and logic
ReactorKit can...
1. Avoid Massive View Controller ✅
Separates responsibilities of view and logic
View Controller becomes simple
ReactorKit can...
2. Take advantages of RxSwift ✅
ReactorKit can...
2. Take advantages of RxSwift ✅
Based on RxSwift
ReactorKit can...
2. Take advantages of RxSwift ✅
Based on RxSwift
All of RxSwift features are available
ReactorKit can...
3. Manage states gracefully ✅
ReactorKit can...
3. Manage states gracefully ✅
Unidirectional data flow
ReactorKit can...
3. Manage states gracefully ✅
Unidirectional data flow
Modify states only in reduce()
ReactorKit can...
3. Manage states gracefully ✅
Unidirectional data flow
Modify states only in reduce()
State management became easy
ReactorKit can...
Be the future
~1.1K ⭐
~50K downloads
~900 apps
https://starcharts.herokuapp.com/ReactorKit/ReactorKit
ReactorKit can...
Be the future
~1.1K ⭐
~50K downloads
~900 apps
https://starcharts.herokuapp.com/ReactorKit/ReactorKit
Basic Concept
Basic Concept
Abstraction of User Interaction
Abstraction of View State
Basic Concept
Renders view states
Handles user interactions
ViewController,Cell,...
Basic Concept
protocol View {
associatedtype Reactor
var disposeBag: DisposeBag
// gets called when
// self.reactor is changed
func bind(reactor: Reactor)
}
Basic Concept
protocol StoryboardView {
associatedtype Reactor
var disposeBag: DisposeBag
// gets called when
// the view is loaded
func bind(reactor: Reactor)
}
// for Storyboard support
Basic Concept
Performs business logic
Manages states
Corresponds to view
Basic Concept
protocol Reactor {
associatedtype Action
associatedtype Mutation
associatedtype State
var initialState: State
}
Basic Concept
Based on RxSwift
Data Flow
Data Flow
Data Flow
Action → State ❌
Data Flow
Action → Mutation → State
Data Flow
Action → Mutation → State
State manipulator
Data Flow
State manipulator
Async-able
Action → Mutation → State
Data Flow
State manipulator
Async-able
Not exposed to view
Action → Mutation → State
Data Flow
(Action) -> Observable<Mutation>
(State, Mutation) -> State
Data Flow
Data Flow
class ProfileViewReactor: Reactor {
enum Action {
}
struct State {
}
}
Data Flow
class ProfileViewReactor: Reactor {
enum Action {
case follow // user interaction
}
struct State {
}
}
Data Flow
class ProfileViewReactor: Reactor {
enum Action {
case follow // user interaction
}
struct State {
var isFollowing: Bool // view state
}
}
Data Flow
class ProfileViewReactor: Reactor {
enum Action {
case follow // user interaction
}
struct State {
var isFollowing: Bool // view state
}
}
Execute user follow API → Change state
Data Flow
class ProfileViewReactor: Reactor {
enum Action {
case follow // user interaction
}
struct State {
var isFollowing: Bool // view state
}
}
Execute user follow API → Change state
Async
Data Flow
class ProfileViewReactor: Reactor {
enum Action {
case follow // user interaction
}
enum Mutation {
}
struct State {
var isFollowing: Bool // view state
}
}
Data Flow
class ProfileViewReactor: Reactor {
enum Action {
case follow // user interaction
}
enum Mutation {
case setFollowing(Bool) // change state
}
struct State {
var isFollowing: Bool // view state
}
}
Data Flow
Data Flow
Tap follow button
Data Flow
Action.follow
Data Flow
Action.follow
Data Flow
UserService.follow()
Data Flow
UserService
Data Flow
Observable<Bool>
Data Flow
Data Flow
Mutation.setFollowing(true)
Data Flow
Mutation.setFollowing(true)
Data Flow
isFollowing = true
Data Flow
Update
follow button
Data Flow
More Examples
More Examples
Advanced
View Communications
Testing View and Reactor
View Communications
ProfileViewController
ProfileViewReactor
View Communications
UICollectionView
ProfileViewController
ProfileViewReactor
View Communications
UICollectionView
ProfileViewController
ProfileViewReactor
UserCell
View Communications
Passing user data
Observing button tap
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
1.User
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
1.User
2.User
View Communications - Passing user data
// ProfileViewReactor
struct State {
}
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
}
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
}
// ProfileViewController
let cell = collectionView.dequeue...
return cell
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
}
// ProfileViewController
let cell = collectionView.dequeue...
if let reactor = self.reactor {
}
return cell
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
}
// ProfileViewController
let cell = collectionView.dequeue...
if let reactor = self.reactor {
cell.user = reactor.currentState.user
}
return cell
View Communications - Observing button tap
ProfileView
Controller
UserCell
ProfileView
Reactor
View Communications - Observing button tap
ProfileView
Controller
UserCell
ProfileView
Reactor
1.rx.tap
View Communications - Observing button tap
ProfileView
Controller
UserCell
ProfileView
Reactor
2.Action.follow
1.rx.tap
View Communications - Observing button tap
ProfileView
Controller
UserCell
ProfileView
Reactor
2.Action.follow
1.rx.tap Reactive Extension
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
}
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
var buttonTap: ControlEvent<Void> {
}
}
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
var buttonTap: ControlEvent<Void> {
return self.base.followButton.rx.tap
}
}
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
var buttonTap: ControlEvent<Void> {
return self.base.followButton.rx.tap
}
}
// ProfileViewController
cell.user = reactor.currentState.user
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
var buttonTap: ControlEvent<Void> {
return self.base.followButton.rx.tap
}
}
// ProfileViewController
cell.user = reactor.currentState.user
cell.rx.buttonTap
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
var tap: ControlEvent<Void> {
return self.base.followButton.rx.tap
}
}
// ProfileViewController
cell.user = reactor.currentState.user
cell.rx.buttonTap
.map { Reactor.Action.follow }
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
var tap: ControlEvent<Void> {
return self.base.followButton.rx.tap
}
}
// ProfileViewController
cell.user = reactor.currentState.user
cell.rx.buttonTap
.map { Reactor.Action.follow }
.bind(to: reactor.action)
View Communications - Observing button tap
// UserCell
extension Reactive where Base: UserCell {
var tap: ControlEvent<Void> {
return self.base.followButton.rx.tap
}
}
// ProfileViewController
cell.user = reactor.currentState.user
cell.rx.buttonTap
.map { Reactor.Action.follow }
.bind(to: reactor.action)
.disposed(by: self.disposeBag)
View Communications
UICollectionView
ProfileViewController
ProfileViewReactor
UserCell
View Communications
UICollectionView
ProfileViewController
ProfileViewReactor
UserCell
UserCellReactor
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
UserCell
Reactor
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
1.CellReactor
UserCell
Reactor
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
1.CellReactor
2.CellReactor
UserCell
Reactor
View Communications - Passing user data
ProfileView
Controller
UserCell
ProfileView
Reactor
1.CellReactor
2.CellReactor
UserCell
Reactor
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
}
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
var userCellReactor: UserCellReactor?
}
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
var userCellReactor: UserCellReactor?
}
// ProfileViewController
cell.user = reactor.currentState.user
View Communications - Passing user data
// ProfileViewReactor
struct State {
var user: User?
var userCellReactor: UserCellReactor?
}
// ProfileViewController
cell.user = reactor.currentState.user
cell.reactor = reactor.currentState.userCellReactor
Testing View and Reactor
What to test?
View
Reactor
Testing View and Reactor
What to test?
View
Action: on user interaction → action sent?
Reactor
Testing View and Reactor
What to test?
View
Action: on user interaction → action sent?
State: on state change → view updated?
Reactor
Testing View and Reactor
What to test?
View
Action: on user interaction → action sent?
State: on state change → view updated?
Reactor
State: on action receive → state updated?
Testing View and Reactor
How to test?
Testing View and Reactor
How to test?
Reactor.stub()
Testing View and Reactor
How to test?
Reactor.stub()
state: set fake state
Testing View and Reactor
How to test?
Reactor.stub()
state: set fake state
action: send fake action
Testing View and Reactor
How to test?
Reactor.stub()
state: set fake state
action: send fake action
actions: log received actions
Testing View and Reactor - View Action
Testing View and Reactor - View Action
When:
follow button taps
Then:
sends follow action
Testing View and Reactor - View Action
// given
let reactor = ProfileViewReactor()
// when
// then
Testing View and Reactor - View Action
// given
let reactor = ProfileViewReactor()
reactor.stub.isEnabled = true
// when
// then
Testing View and Reactor - View Action
// given
let reactor = ProfileViewReactor()
reactor.stub.isEnabled = true
reactor.stub.state.value.user = User()
// when
// then
Testing View and Reactor - View Action
// given
let reactor = ProfileViewReactor()
reactor.stub.isEnabled = true
reactor.stub.state.value.user = User()
let viewController = ProfileViewController()
viewController.reactor = reactor
// when
// then
Testing View and Reactor - View Action
// given
let reactor = ProfileViewReactor()
reactor.stub.isEnabled = true
reactor.stub.state.value.user = User()
let viewController = ProfileViewController()
viewController.reactor = reactor
// when
let button = viewController.userCell.followButton
// then
Testing View and Reactor - View Action
// given
let reactor = ProfileViewReactor()
reactor.stub.isEnabled = true
reactor.stub.state.value.user = User()
let viewController = ProfileViewController()
viewController.reactor = reactor
// when
let button = viewController.userCell.followButton
button.sendActions(for: .touchUpInside)
// then
Testing View and Reactor - View Action
// given
let reactor = ProfileViewReactor()
reactor.stub.isEnabled = true
reactor.stub.state.value.user = User()
let viewController = ProfileViewController()
viewController.reactor = reactor
// when
let button = viewController.userCell.followButton
button.sendActions(for: .touchUpInside)
// then
let lastAction = reactor.stub.actions.last
XCTAssertEqual(lastAction, .follow)
Testing View and Reactor - View State
When:
following the user
Then:
button is selected
Testing View and Reactor - View State
// given
let cellReactor = UserCellReactor()
// when
// then
Testing View and Reactor - View State
// given
let cellReactor = UserCellReactor()
cellReactor.stub.isEnabled = true
// when
// then
Testing View and Reactor - View State
// given
let cellReactor = UserCellReactor()
cellReactor.stub.isEnabled = true
let cell = UserCell()
cell.reactor = cellReactor
// when
// then
Testing View and Reactor - View State
// given
let cellReactor = UserCellReactor()
cellReactor.stub.isEnabled = true
let cell = UserCell()
cell.reactor = cellReactor
// when
cellReactor.stub.state.value.isFollowing = true
// then
Testing View and Reactor - View State
// given
let cellReactor = UserCellReactor()
cellReactor.stub.isEnabled = true
let cell = UserCell()
cell.reactor = cellReactor
// when
cellReactor.stub.state.value.isFollowing = true
// then
XCTAssertTrue(cell.followButton.isSelected)
Testing View and Reactor - Reactor State
When:
receive follow action
Then:
update following state
ProfileView
Reactor
Testing View and Reactor - Reactor State
// given
let reactor = ProfileViewReactor()
// when
// then
Testing View and Reactor - Reactor State
// given
let reactor = ProfileViewReactor()
// when
reactor.action.onNext(.follow)
// then
Testing View and Reactor - Reactor State
// given
let reactor = ProfileViewReactor()
// when
reactor.action.onNext(.follow)
// then
let user = reactor.currentState.user
XCTAssertEqual(user?.isFollowing, true)
Future Ideas
Development
Documentation
Community
Development
Testing Support
SectionReactor
AlertReactor
ModelReactor
Plugins
...
Nested stub
Dummy reactor
...
Building Extensions
Documentation
Best Practices
Translations
Code-level Documentation
Community
RxSwift Slack #reactorkit (English)
https://rxswift-slack.herokuapp.com
Swift Korea Slack #reactorkit (Korean)
http://slack.swiftkorea.org
https://reactorkit.io

Weitere ähnliche Inhalte

Was ist angesagt?

Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey
 

Was ist angesagt? (20)

LetSwift 2017 - 토스 iOS 앱의 개발/배포 환경
LetSwift 2017 - 토스 iOS 앱의 개발/배포 환경LetSwift 2017 - 토스 iOS 앱의 개발/배포 환경
LetSwift 2017 - 토스 iOS 앱의 개발/배포 환경
 
알아보자 Dependency Injection과 Deli
알아보자 Dependency Injection과 Deli알아보자 Dependency Injection과 Deli
알아보자 Dependency Injection과 Deli
 
NestJS
NestJSNestJS
NestJS
 
Express JS
Express JSExpress JS
Express JS
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Tech Talk on ReactJS
Tech Talk on ReactJSTech Talk on ReactJS
Tech Talk on ReactJS
 
Flask Introduction - Python Meetup
Flask Introduction - Python MeetupFlask Introduction - Python Meetup
Flask Introduction - Python Meetup
 
Nest.js Introduction
Nest.js IntroductionNest.js Introduction
Nest.js Introduction
 
React - Introdução
React - IntroduçãoReact - Introdução
React - Introdução
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVC
 
Threading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin CoroutinesThreading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
 
ReactJS
ReactJSReactJS
ReactJS
 
그래서 테스트 코드는 어떻게 작성하나요?.pdf
그래서 테스트 코드는 어떻게 작성하나요?.pdf그래서 테스트 코드는 어떻게 작성하나요?.pdf
그래서 테스트 코드는 어떻게 작성하나요?.pdf
 
Vue JS Intro
Vue JS IntroVue JS Intro
Vue JS Intro
 
Redux Thunk
Redux ThunkRedux Thunk
Redux Thunk
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
Workshop 21: React Router
Workshop 21: React RouterWorkshop 21: React Router
Workshop 21: React Router
 
MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기
MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기
MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1
 

Ähnlich wie Hello, ReactorKit 

[Final] ReactJS presentation
[Final] ReactJS presentation[Final] ReactJS presentation
[Final] ReactJS presentation
洪 鹏发
 
Controllers & actions
Controllers & actionsControllers & actions
Controllers & actions
Eyal Vardi
 

Ähnlich wie Hello, ReactorKit  (20)

What 100M downloads taught us about iOS architectures
What 100M downloads taught us about iOS architecturesWhat 100M downloads taught us about iOS architectures
What 100M downloads taught us about iOS architectures
 
From mvc to redux: 停看聽
From mvc to redux: 停看聽From mvc to redux: 停看聽
From mvc to redux: 停看聽
 
Android architecture components - how they fit in good old architectural patt...
Android architecture components - how they fit in good old architectural patt...Android architecture components - how they fit in good old architectural patt...
Android architecture components - how they fit in good old architectural patt...
 
React + Redux + TypeScript === ♥
React + Redux + TypeScript === ♥React + Redux + TypeScript === ♥
React + Redux + TypeScript === ♥
 
ReRxSwift
ReRxSwiftReRxSwift
ReRxSwift
 
Spring Web Flow. A little flow of happiness.
Spring Web Flow. A little flow of happiness.Spring Web Flow. A little flow of happiness.
Spring Web Flow. A little flow of happiness.
 
Building Modern Web Applications using React and Redux
 Building Modern Web Applications using React and Redux Building Modern Web Applications using React and Redux
Building Modern Web Applications using React and Redux
 
Intro react js
Intro react jsIntro react js
Intro react js
 
Developing JSR 286 Portlets
Developing JSR 286 PortletsDeveloping JSR 286 Portlets
Developing JSR 286 Portlets
 
Damian Kmiecik - Road trip with Redux
Damian Kmiecik - Road trip with ReduxDamian Kmiecik - Road trip with Redux
Damian Kmiecik - Road trip with Redux
 
Unidirectional Data Flow in Swift
Unidirectional Data Flow in SwiftUnidirectional Data Flow in Swift
Unidirectional Data Flow in Swift
 
How to use redux with react hooks in react native application
How to use redux with react hooks in react native applicationHow to use redux with react hooks in react native application
How to use redux with react hooks in react native application
 
Getting started with Redux js
Getting started with Redux jsGetting started with Redux js
Getting started with Redux js
 
Project Description Of Incident Management System Developed by PRS (CRIS) , N...
Project Description Of Incident Management System Developed by PRS (CRIS) , N...Project Description Of Incident Management System Developed by PRS (CRIS) , N...
Project Description Of Incident Management System Developed by PRS (CRIS) , N...
 
iOS Architectures
iOS ArchitecturesiOS Architectures
iOS Architectures
 
React & The Art of Managing Complexity
React &  The Art of Managing ComplexityReact &  The Art of Managing Complexity
React & The Art of Managing Complexity
 
[Final] ReactJS presentation
[Final] ReactJS presentation[Final] ReactJS presentation
[Final] ReactJS presentation
 
Content-Driven Apps with React
Content-Driven Apps with ReactContent-Driven Apps with React
Content-Driven Apps with React
 
Controllers & actions
Controllers & actionsControllers & actions
Controllers & actions
 
Reactивная тяга
Reactивная тягаReactивная тяга
Reactивная тяга
 

Mehr von Suyeol Jeon

Present your presentation
Present your presentationPresent your presentation
Present your presentation
Suyeol Jeon
 
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
Suyeol Jeon
 

Mehr von Suyeol Jeon (11)

Let's TDD
Let's TDDLet's TDD
Let's TDD
 
Building Funnels with Google BigQuery
Building Funnels with Google BigQueryBuilding Funnels with Google BigQuery
Building Funnels with Google BigQuery
 
RxSwift 시작하기
RxSwift 시작하기RxSwift 시작하기
RxSwift 시작하기
 
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
 
Evermind
EvermindEvermind
Evermind
 
StyleShare 2014년 8월 관점공유 - 전수열
StyleShare 2014년 8월 관점공유 - 전수열StyleShare 2014년 8월 관점공유 - 전수열
StyleShare 2014년 8월 관점공유 - 전수열
 
Present your presentation
Present your presentationPresent your presentation
Present your presentation
 
Joyfl 창업이야기.ssul
Joyfl 창업이야기.ssulJoyfl 창업이야기.ssul
Joyfl 창업이야기.ssul
 
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
좋은 디자이너, 나쁜 프로젝트매니저, 이상한 개발자
 
Evermind (2차 평가)
Evermind (2차 평가)Evermind (2차 평가)
Evermind (2차 평가)
 
I'm Traveling
I'm TravelingI'm Traveling
I'm Traveling
 

Kürzlich hochgeladen

Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Christo Ananth
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
ankushspencer015
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 

Kürzlich hochgeladen (20)

(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
 
AKTU Computer Networks notes --- Unit 3.pdf
AKTU Computer Networks notes ---  Unit 3.pdfAKTU Computer Networks notes ---  Unit 3.pdf
AKTU Computer Networks notes --- Unit 3.pdf
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations
 
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
 
Thermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - VThermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - V
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
 
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performance
 
Glass Ceramics: Processing and Properties
Glass Ceramics: Processing and PropertiesGlass Ceramics: Processing and Properties
Glass Ceramics: Processing and Properties
 
UNIT-III FMM. DIMENSIONAL ANALYSIS
UNIT-III FMM.        DIMENSIONAL ANALYSISUNIT-III FMM.        DIMENSIONAL ANALYSIS
UNIT-III FMM. DIMENSIONAL ANALYSIS
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
NFPA 5000 2024 standard .
NFPA 5000 2024 standard                                  .NFPA 5000 2024 standard                                  .
NFPA 5000 2024 standard .
 
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank  Design by Working Stress - IS Method.pdfIntze Overhead Water Tank  Design by Working Stress - IS Method.pdf
Intze Overhead Water Tank Design by Working Stress - IS Method.pdf
 
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 

Hello, ReactorKit 