Network Indicator IOS - ios

I would like to ask that is there a way to show network indicator automatically when there is network activity going on and hide the network indicator when there is no network activity

You have to control it by using your start and completion of your network calls.
Lets say:
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self showNetworkActivitySpinner];
[self fetchDataFromServer];
}
- (void)fetchDataFromServer{
[SomeApiCallClass callWebServiceWithPostData:(NSDictionary *)someDataToPost andCompletionHandler:(^void) {
[self hideNetworkActivitySpinner];
}];
}

Related

Pause any operations while UIScrollView is scrolling

I have a big paginated UIScrollView with severals image and views in it. The thing I'm trying to achieve is to pause any background operation while the user is swiping through pages. I need this because the app is downloading and computing stuff and the swipe animations isn't smooth.
Any ideas?
Thanks
You should think in reverse manner.
Once the image was downloaded in background then update it in UI by using Main thread.
The Main Thread is handling the UI updates.
Based on your description,
"the swipe animations isn't smooth"
You are downloading images on Main thread.
You can use NSOperationQueue and catch the scroll event in the UIScrollView's delegate to pause/continue the operations.
- (void)viewDidLoad{
[super viewDidLoad];
queue=[[NSOperationQueue alloc]init];
NSBlockOperation *intenseOperation=[NSBlockOperation blockOperationWithBlock:^{
//do intense stuff
}];
[queue addOperation:intenseOperation];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
[queue setSuspended:NO];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[queue setSuspended:YES];
}

Chromecast button not hiding

I am using google casting through my app. It is working good but I am not able to hide the casting button when the cast device goes offline. It hides automatically but after a long time. How can I hide it immediately. Is there a way to get the notifications from the device scanner class.
You should try adding listener
[self.deviceScanner addListener:self];
[self.deviceScanner startScan];
#pragma mark - GCKDeviceScannerListener
- (void)deviceDidComeOnline:(GCKDevice *)device {
NSLog(#"device found!! %#", device.friendlyName);
[self updateCastIconButtonStates];
if ([self.delegate respondsToSelector:#selector(didDiscoverDeviceOnNetwork)]) {
[self.delegate didDiscoverDeviceOnNetwork];
}
}
- (void)deviceDidGoOffline:(GCKDevice *)device {
[self updateCastIconButtonStates];
}
Update
Similar Question.

How to delay the prompt for location services permission

In my app I'm using CLLocationManager and MKMapView. When app launches, I present the user with a disclaimer (once) which has to be accepted. However, when the disclaimer is shown, a popup appears requesting access to the user location.
Is there a way to delay this alertView until the disclaimer is accepted?
Please advice.
EDIT:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
if([[NSUserDefaults standardUserDefaults] objectForKey:#"disclaimerAccepted"] == nil) {
[self firstRun];
[[NSUserDefaults standardUserDefaults] synchronize];
}
else
{
[self locationStuff];
}
)
The location alert view is only displayed when you actually request the user's location, so the simplest way to do this would be to ensure that the first time your app is run you start the CLLocationManager or display the MKMapView until after your disclaimer has been accepted. This may require you to move around some methods.
Maybe you need first check for disclaimer and if it accepted start CLLocationManager. If disclaimer not accepted - wait for acceptation and that start CLLocationManager.
- (void)viewDidLoad
{
[super viewDidLoad];
if (disclaimerAccepted)
{
//start CLLocationManager
}
else
{
//Show disclaimer
}
}
- (void)disclaimerAccepted
{
disclaimerAccepted = YES;
//start CLLocationManager
}

Dealing with two screens and one activity indicator in iOS

I have 3 screens on my app.First is login. Second is search and third is process the task.
On login i retrieve data from a web service. It returns data in XML format. So the data is considerably large. So i am doing that task on a background thread like this to stop Mainthread freezing up on me:
-(BOOL)loginEmp
{
.....some computation
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
[self getAllCustomerValues];
});
}
-(void)getAllCustomerValues
{
....more computation.Bring the data,parse it and save it to CoreData DB.
//notification - EDIT
NSNotification *notification =[NSNotification notificationWithName:#"reloadRequest"
object:self];
[[NSNotificationCenter defaultCenter] postNotification : notification];
}
//EDIT
//SearchScreenVC.m
- (void)viewDidLoad
{
....some computation
[self.customerActIndicator startAnimating];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:#selector(stopActivityIndicator)
name:#"reloadRequest"
object:nil];
}
- (void)stopActivityIndicator
{
[self.customerActIndicator stopAnimating];
self.customerActIndicator.hidesWhenStopped = YES;
self.customerActIndicator.hidden =YES;
NSLog(#"HIt this at 127");
}
So on condition that login was successful, i move to screen 2. But the background thread is still in process( i know because i have logs logging values) . I want an activity indicator showing up here (2nd screen)telling user to wait before he starts searching. So how do i do it?How can i make my activity indicator listen/wait for background thread. Please let me know if you need more info.Thanks
EDIT: so I edited accordingly but the notification never gets called. I put a notification at the end of getAllCustomerValues and in viewDidLoad of SearchScreen i used it. That notification on 2nd screen to stop animating never gets called. What is the mistake i am doing.?Thanks
EDIT 2: So it finally hits the method. I dont know what made it to hit that method. I put a break point. I wrote to stop animating but it wouldn't. I wrote hidesWhenStoppped and hidden both to YES. But it still keeps animating.How do i get it to stop?
Ok, if it is not the main thread, put the following in and that should fix it.
- (void)stopActivityIndicator
{
if(![NSThread isMainThread]){
[self performSelectorOnMainThread:#selector(stopActivityIndicator) withObject:nil waitUntilDone:NO];
return;
}
[self.customerActIndicator stopAnimating];
self.customerActIndicator.hidesWhenStopped = YES;
self.customerActIndicator.hidden =YES;
NSLog(#"HIt this at 127");
}
Could you put your background operation into a separate class and then set a delegate on it so you can alert the delegate once the operation has completed?
I havent tried this, its just an idea :)
You could use a delegate pointing to your view controller & a method in your view controller like:
- (void) updateProgress:(NSNumber*)percentageComplete {
}
And then in the background thread:
float percentComplete = 0.5; // for example
NSNumber *percentComplete = [NSNumber numberWithFloat:percentComplete];
[delegate performSelectorOnMainThread:#selector(updateProgress:) withObject:percentageComplete waitUntilDone:NO];

iOS - Thread and alertiview

i've an app that when start control updates and other things. If the app find some updates they will ask user if this updates have to be done. If user select YES i want that a spinner appear on main screen until update finish. But when i tap YES my alert view doesn't disappear and remain on screen until update is finished.
Is it possible to create a thread that run on the main thread and stop when update in finished?
Thanks
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex==1) {
[self showActivityViewer];
[self downloadControlAndUpdatePoi];
[self downloadControlAndUpdateItinerari];
[self downloadControlAndUpdateArtisti];
[self downloadControlAndUpdateEventi];
[self hideActivityViewer];
NSLog(#"AGGIORNA");
} else {
NSLog(#"NON AGGIORNARE");
return;
}
}
If the methods
[self downloadControlAndUpdatePoi];
[self downloadControlAndUpdateItinerari];
[self downloadControlAndUpdateArtisti];
[self downloadControlAndUpdateEventi];
are executed synchronously (that means that they return only after having processed completely), so:
[self hideActivityViewer];
is executed only at the very end.
A simple approach to this is scheduling the execution of your methods on the main thread:
[self performSelector:#selector(downloadControlAndUpdatePoi) withObject:nil afterDelay:0];
....
[self hideActivityViewer];
so that those methods are executed only after control has returned to the main loop and the UI has been updated.
Otherwise, you could use:
+ detachNewThreadSelector:toTarget:withObject:
from NSThread, to do more or less the same. In this case I would suggest creating a wrapper method for all of your dowloadAndUpdate... methods, but keep in mind that you can't update the UI from a secondary thread.
In both cases, you should take some care about synchronizing the download... operations with the rest of your workflow after removing the alert view.

Resources