Skip to content

Commit

Permalink
models the spinner behavior after AFNetworking; hiding the spinner is…
Browse files Browse the repository at this point in the history
… delayed (avoids flickering), thread support (all updates are on the main thread)
  • Loading branch information
colinta committed Mar 7, 2014
1 parent dc8eacf commit b09da68
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 18 deletions.
39 changes: 33 additions & 6 deletions motion/network-indicator/network-indicator.rb
Original file line number Diff line number Diff line change
@@ -1,17 +1,44 @@
module BubbleWrap
module NetworkIndicator
DELAY = 0.2

module_function

def show
self.counter += 1
UIApplication.sharedApplication.networkActivityIndicatorVisible = true
if Dispatch::Queue.current.to_s == 'com.apple.main-thread'
self.counter += 1
self.update_spinner
else
Dispatch::Queue.main.async do
self.show
end
end
end

def hide
self.counter = [self.counter - 1, 0].max
if self.counter == 0
UIApplication.sharedApplication.networkActivityIndicatorVisible = false
if Dispatch::Queue.current.to_s == 'com.apple.main-thread'
self.counter = [self.counter - 1, 0].max
if self.counter == 0
if @hide_indicator_timer
@hide_indicator_timer.invalidate
end
@hide_indicator_timer = NSTimer.timerWithTimeInterval(DELAY - 0.01, target: self, selector: :update_spinner, userInfo: nil, repeats: false)
NSRunLoop.mainRunLoop.addTimer(@hide_indicator_timer, forMode:NSRunLoopCommonModes)
end
else
Dispatch::Queue.main.async do
self.hide
end
end
end

def update_spinner
if Dispatch::Queue.current.to_s == 'com.apple.main-thread'
UIApplication.sharedApplication.networkActivityIndicatorVisible = (@counter > 0)
else
Dispatch::Queue.main.async do
self.update_spinner
end
end
end

Expand All @@ -21,7 +48,7 @@ def visible?

def reset!
@counter = 0
UIApplication.sharedApplication.networkActivityIndicatorVisible = false
self.update_spinner
end

def counter
Expand Down
67 changes: 55 additions & 12 deletions spec/motion/network-indicator/network_indicator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,40 +5,81 @@
UIApplication.sharedApplication.networkActivityIndicatorVisible = false
end

it 'should show the indicator' do
it 'should show the indicator immediately' do
BW::NetworkIndicator.show
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
end

it 'should show the indicator from any thread' do
Dispatch::Queue.concurrent.async do
BW::NetworkIndicator.show
end
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
end
end

it 'should hide the indicator' do
BW::NetworkIndicator.show
BW::NetworkIndicator.hide
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
end
end

it 'should keep track of how many times `show` was called' do
BW::NetworkIndicator.show
it 'should hide the indicator after a delay' do
BW::NetworkIndicator.show
BW::NetworkIndicator.hide
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
end
end

it 'should not hide the indicator if show/hide/show is called quickly' do
BW::NetworkIndicator.show
BW::NetworkIndicator.hide
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
wait BW::NetworkIndicator::DELAY/2 do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
BW::NetworkIndicator.show
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
end
end
end

it 'should keep track of how many times `show` was called' do
BW::NetworkIndicator.show
BW::NetworkIndicator.show
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
BW::NetworkIndicator.hide
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
BW::NetworkIndicator.hide
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
end
end
end

it 'should allow `hide` to be called too many times' do
BW::NetworkIndicator.show
BW::NetworkIndicator.show
BW::NetworkIndicator.hide
BW::NetworkIndicator.hide
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false

BW::NetworkIndicator.hide
BW::NetworkIndicator.hide
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false
BW::NetworkIndicator.hide
BW::NetworkIndicator.hide
wait BW::NetworkIndicator::DELAY do
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == false

BW::NetworkIndicator.show
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
BW::NetworkIndicator.show
UIApplication.sharedApplication.networkActivityIndicatorVisible?.should == true
end
end
end

it 'should reset the counter when `reset!` is called' do
Expand All @@ -52,7 +93,9 @@
BW::NetworkIndicator.show
BW::NetworkIndicator.visible?.should == true
BW::NetworkIndicator.hide
BW::NetworkIndicator.visible?.should == false
wait BW::NetworkIndicator::DELAY do
BW::NetworkIndicator.visible?.should == false
end
end

end

0 comments on commit b09da68

Please sign in to comment.