Improves delete simulators script.

This commit is contained in:
Krunoslav Zaher 2015-08-13 21:20:31 +02:00
parent 2da4774028
commit 66dfc64207
2 changed files with 72 additions and 117 deletions

View File

@ -24,26 +24,19 @@ class MergeSinkIter<S: ObservableType, O: ObserverType where O.Element == S.E> :
}
func on(event: Event<Element>) {
switch event {
case .Next:
parent.lock.performLocked {
trySend(parent.observer, event)
}
case .Error:
parent.lock.performLocked {
trySend(parent.observer, event)
self.parent.dispose()
}
case .Completed:
let group = parent.mergeState.group
group.removeDisposable(disposeKey)
self.parent.lock.performLocked {
let state = parent.mergeState
parent.lock.performLocked {
switch event {
case .Next:
parent.observer?.on(event)
case .Error:
parent.observer?.on(event)
parent.dispose()
case .Completed:
parent.group.removeDisposable(disposeKey)
if state.stopped && state.group.count == 1 {
trySendCompleted(parent.observer)
self.parent.dispose()
if parent.stopped && parent.group.count == 1 {
parent.observer?.on(.Completed)
parent.dispose()
}
}
}
@ -54,47 +47,36 @@ class MergeSink<S: ObservableType, O: ObserverType where O.Element == S.E> : Sin
typealias Element = S
typealias Parent = Merge<S>
typealias MergeState = (
stopped: Bool,
group: CompositeDisposable,
sourceSubscription: SingleAssignmentDisposable
)
let parent: Parent
var lock = NSRecursiveLock()
var mergeState: MergeState = (
stopped: false,
group: CompositeDisposable(),
sourceSubscription: SingleAssignmentDisposable()
)
// state
var stopped = false
let group = CompositeDisposable()
let sourceSubscription = SingleAssignmentDisposable()
init(parent: Parent, observer: O, cancel: Disposable) {
self.parent = parent
_ = self.mergeState
super.init(observer: observer, cancel: cancel)
}
func run() -> Disposable {
let state = self.mergeState
state.group.addDisposable(state.sourceSubscription)
group.addDisposable(sourceSubscription)
let disposable = self.parent.sources.subscribeSafe(self)
state.sourceSubscription.disposable = disposable
sourceSubscription.disposable = disposable
return state.group
return group
}
func on(event: Event<Element>) {
switch event {
case .Next(let value):
let innerSubscription = SingleAssignmentDisposable()
let maybeKey = mergeState.group.addDisposable(innerSubscription)
let maybeKey = group.addDisposable(innerSubscription)
if let key = maybeKey {
let observer = MergeSinkIter(parent: self, disposeKey: key)
@ -103,23 +85,19 @@ class MergeSink<S: ObservableType, O: ObserverType where O.Element == S.E> : Sin
}
case .Error(let error):
lock.performLocked {
trySendError(observer, error)
observer?.on(.Error(error))
self.dispose()
}
case .Completed:
lock.performLocked {
let mergeState = self.mergeState
let group = mergeState.group
self.mergeState.stopped = true
self.stopped = true
if group.count == 1 {
trySendCompleted(observer)
observer?.on(.Completed)
self.dispose()
}
else {
mergeState.sourceSubscription.dispose()
sourceSubscription.dispose()
}
}
}
@ -142,30 +120,25 @@ class MergeConcurrentSinkIter<S: ObservableType, O: ObserverType where S.E == O.
}
func on(event: Event<Element>) {
switch event {
case .Next:
parent.lock.performLocked {
trySend(parent.observer, event)
}
case .Error:
parent.lock.performLocked {
trySend(parent.observer, event)
parent.lock.performLocked {
switch event {
case .Next:
parent.observer?.on(event)
case .Error:
parent.observer?.on(event)
self.parent.dispose()
}
case .Completed:
parent.lock.performLocked {
let mergeState = parent.mergeState
mergeState.group.removeDisposable(disposeKey)
if mergeState.queue.value.count > 0 {
let s = mergeState.queue.value.dequeue()
self.parent.subscribe(s, group: mergeState.group)
case .Completed:
parent.group.removeDisposable(disposeKey)
let queue = parent.queue
if queue.value.count > 0 {
let s = queue.value.dequeue()
self.parent.subscribe(s, group: parent.group)
}
else {
parent.mergeState.activeCount = mergeState.activeCount - 1
parent.activeCount = parent.activeCount - 1
if mergeState.stopped && parent.mergeState.activeCount == 0 {
trySendCompleted(parent.observer)
if parent.stopped && parent.activeCount == 0 {
parent.observer?.on(.Completed)
self.parent.dispose()
}
}
@ -179,42 +152,29 @@ class MergeConcurrentSink<S: ObservableType, O: ObserverType where S.E == O.Elem
typealias Parent = Merge<S>
typealias QueueType = Queue<S>
typealias MergeState = (
stopped: Bool,
queue: RxMutableBox<QueueType>,
sourceSubscription: SingleAssignmentDisposable,
group: CompositeDisposable,
activeCount: Int
)
let parent: Parent
var lock = NSRecursiveLock()
var mergeState: MergeState = (
stopped: false,
queue: RxMutableBox(Queue(capacity: 2)),
sourceSubscription: SingleAssignmentDisposable(),
group: CompositeDisposable(),
activeCount: 0
)
var stopped = false
var activeCount = 0
var queue = RxMutableBox(QueueType(capacity: 2))
let sourceSubscription = SingleAssignmentDisposable()
let group = CompositeDisposable()
init(parent: Parent, observer: O, cancel: Disposable) {
self.parent = parent
let state = self.mergeState
_ = state.group.addDisposable(state.sourceSubscription)
group.addDisposable(sourceSubscription)
super.init(observer: observer, cancel: cancel)
}
func run() -> Disposable {
let state = self.mergeState
state.group.addDisposable(state.sourceSubscription)
group.addDisposable(sourceSubscription)
let disposable = self.parent.sources.subscribeSafe(self)
state.sourceSubscription.disposable = disposable
return state.group
sourceSubscription.disposable = disposable
return group
}
func subscribe(innerSource: Element, group: CompositeDisposable) {
@ -233,41 +193,36 @@ class MergeConcurrentSink<S: ObservableType, O: ObserverType where S.E == O.Elem
func on(event: Event<Element>) {
switch event {
case .Next(let value):
let subscribe = lock.calculateLocked { () -> Bool in
let mergeState = self.mergeState
if mergeState.activeCount < self.parent.maxConcurrent {
self.mergeState.activeCount += 1
if activeCount < self.parent.maxConcurrent {
self.activeCount += 1
return true
}
else {
mergeState.queue.value.enqueue(value)
queue.value.enqueue(value)
return false
}
}
if subscribe {
self.subscribe(value, group: mergeState.group)
self.subscribe(value, group: group)
}
case .Error(let error):
lock.performLocked {
trySendError(observer, error)
observer?.on(.Error(error))
self.dispose()
}
case .Completed:
lock.performLocked {
let mergeState = self.mergeState
_ = mergeState.group
if mergeState.activeCount == 0 {
trySendCompleted(observer)
if activeCount == 0 {
observer?.on(.Completed)
self.dispose()
}
else {
mergeState.sourceSubscription.dispose()
sourceSubscription.dispose()
}
self.mergeState.stopped = true
stopped = true
}
}
}

View File

@ -91,21 +91,21 @@ function createDevices() {
}
function deleteDevices() {
xcrun simctl delete RxSwiftTest-iPhone4s-iOS_7.1
xcrun simctl delete RxSwiftTest-iPhone5-iOS_7.1
xcrun simctl delete RxSwiftTest-iPhone5s-iOS_7.1
xcrun simctl delete RxSwiftTest-iPhone4s-iOS_7.1 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone5-iOS_7.1 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone5s-iOS_7.1 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone4s-iOS_8.4
xcrun simctl delete RxSwiftTest-iPhone5-iOS_8.4
xcrun simctl delete RxSwiftTest-iPhone5s-iOS_8.4
xcrun simctl delete RxSwiftTest-iPhone4s-iOS_8.4 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone5-iOS_8.4 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone5s-iOS_8.4 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone6-iOS_8.4
xcrun simctl delete RxSwiftTest-iPhone6Plus-iOS_8.4
xcrun simctl delete RxSwiftTest-iPhone6-iOS_8.4 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone6Plus-iOS_8.4 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone4s-iOS_9.0
xcrun simctl delete RxSwiftTest-iPhone5-iOS_9.0
xcrun simctl delete RxSwiftTest-iPhone5s-iOS_9.0
xcrun simctl delete RxSwiftTest-iPhone4s-iOS_9.0 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone5-iOS_9.0 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone5s-iOS_9.0 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone6-iOS_9.0
xcrun simctl delete RxSwiftTest-iPhone6Plus-iOS_9.0
xcrun simctl delete RxSwiftTest-iPhone6-iOS_9.0 || echo "failed"
xcrun simctl delete RxSwiftTest-iPhone6Plus-iOS_9.0 || echo "failed"
}