iOS Using UIActivityIndicator

uaecasher

macrumors 65816
Original poster
Jan 29, 2009
1,290
0
Stillwater, OK
Hello,

I'm adding upload feature for my app and I want to show the user when the app is uploading, I read the documentation and couple of websites but couldn't get it to work, so I'm wondering if you guys could help me.

1) I made a UIActivityIndicator in the Interface builder (with "Hide When Stopped" checked)

2) I made IBOutlet for it and named it spinner.

3) I added @property for it and @synthesized it in my .m

now I'm not sure what I should do or where I should put the start animating code, here is my .m file:

Code:
#import "testPickerViewController.h"

@implementation testPickerViewController

@synthesize imgPicker;
@synthesize imgPickerCam;
@synthesize spinner;





- (IBAction)grabImage {
	self.imgPicker = [[UIImagePickerController alloc] init];
	self.imgPicker.delegate = self;	
	self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
	[self presentModalViewController:self.imgPicker animated:YES];
	
	
}

-(IBAction)grabImageCam {
	self.imgPickerCam = [[UIImagePickerController alloc] init];
	self.imgPickerCam.delegate = self;
	self.imgPickerCam.sourceType = UIImagePickerControllerSourceTypeCamera;
	[self presentModalViewController:self.imgPickerCam animated:YES];


}






  - (IBAction)uploadImage {
	/*
	 turning the image into a NSData object
	 getting the image back out of the UIImageView
	 setting the quality to 90
	 */
	  
	  
	  
	NSData *imageData = UIImageJPEGRepresentation(image.image, 100);
	  
	// setting up the URL to post to
	NSString *urlString = @"http://mozymac.com/upload.php";
	
	// setting up the request object now
	NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
	[request setURL:[NSURL URLWithString:urlString]];
	[request setHTTPMethod:@"POST"];
	
	/*
	 add some header info now
	 we always need a boundary when we post a file
	 also we need to set the content type
	 
	 You might want to generate a random boundary.. this is just the same 
	 as my output from wireshark on a valid html post
	 */
	NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
	NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
	[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
	
	/*
	 now lets create the body of the post
	 */
	NSMutableData *body = [NSMutableData data];
	[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];	
	[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\".jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
	[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
	[body appendData:[NSData dataWithData:imageData]];
	[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
	// setting the body of the post to the reqeust
	[request setHTTPBody:body];
	
	// now lets make the connection to the web
	NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
	NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
	  
	
	myTextField.text = (returnString);
	
	 
	
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
	image.image = img;	
	[[picker parentViewController] dismissModalViewControllerAnimated:YES];
	
	// need to show the upload image button now
	upload.hidden = NO;
}

@end
 

uaecasher

macrumors 65816
Original poster
Jan 29, 2009
1,290
0
Stillwater, OK
I'm not sure where I should put the [spinner startanimating] ,here is my current position:

Code:
 - (IBAction)uploadImage {
	/*
	 turning the image into a NSData object
	 getting the image back out of the UIImageView
	 setting the quality to 90
	 */
	  
	  [spinner stopAnimating];
	//code....
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
	[spinner startAnimating];
	image.image = img;
	
	

	[[picker parentViewController] dismissModalViewControllerAnimated:YES];
	// need to show the upload image button now
	upload.hidden = NO;

}

@end
The problem is that the indicator starts after choosing the picture not clicking the upload button, I tired moving it around but if i move it in middle it will start after the upload.

here is the full code:

Code:
 - (IBAction)uploadImage {
	/*
	 turning the image into a NSData object
	 getting the image back out of the UIImageView
	 setting the quality to 90
	 */
	  
	  [spinner stopAnimating];
	  
	NSData *imageData = UIImageJPEGRepresentation(image.image, 100);
	  

	// setting up the URL to post to
	NSString *urlString = @"http://mozymac.com/upload.php";
	
	// setting up the request object now
	NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
	[request setURL:[NSURL URLWithString:urlString]];
	[request setHTTPMethod:@"POST"];
	
	/*
	 add some header info now
	 we always need a boundary when we post a file
	 also we need to set the content type
	 
	 You might want to generate a random boundary.. this is just the same 
	 as my output from wireshark on a valid html post
	 */
	NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
	NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
	[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
	
	/*
	 now lets create the body of the post
	 */
	NSMutableData *body = [NSMutableData data];
	[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];	
	[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\".jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
	[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
	[body appendData:[NSData dataWithData:imageData]];
	[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
	// setting the body of the post to the reqeust
	[request setHTTPBody:body];
	
	// now lets make the connection to the web
	NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
	NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
	  
	
	myTextField.text = (returnString);
	
	 
	
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
	[spinner startAnimating];
	image.image = img;
	
	

	[[picker parentViewController] dismissModalViewControllerAnimated:YES];
	// need to show the upload image button now
	upload.hidden = NO;

}

@end
 

robbieduncan

Moderator emeritus
Jul 24, 2002
24,764
133
Harrogate
As your uploadData method blocks the main thread no UI updates (like starting the spinner) will happen when it's running. I'd personally stick it in a thread (and use async NSURLConnection methods)...
 

uaecasher

macrumors 65816
Original poster
Jan 29, 2009
1,290
0
Stillwater, OK
As your uploadData method blocks the main thread no UI updates (like starting the spinner) will happen when it's running. I'd personally stick it in a thread (and use async NSURLConnection methods)...
so there isn't anyway to do it unless I use NSURLConnection?
 

robbieduncan

Moderator emeritus
Jul 24, 2002
24,764
133
Harrogate
so there isn't anyway to do it unless I use NSURLConnection?
:confused: Do what? The upload? Not really. But you could use the async methods of NSURLConnection to make it not block the primary thread so the UI could update. If you did that then you could start the spinner in uploadImage and end it in the appropriate NSURLConnection delegate method.
 

uaecasher

macrumors 65816
Original poster
Jan 29, 2009
1,290
0
Stillwater, OK
:confused: Do what? The upload? Not really. But you could use the async methods of NSURLConnection to make it not block the primary thread so the UI could update. If you did that then you could start the spinner in uploadImage and end it in the appropriate NSURLConnection delegate method.
Ok this gonna sound really bad but could you help me change my code to NSURLConnection? I searched and saw the documentation but not really sure how to begin, I'm still in learning progress (finished Learning Objective C 2.0) but waiting for my Beginning Iphone 3.0 Development book, I'm doing this project for learning purposes as I like to learn by trying.

Thanks
 

robbieduncan

Moderator emeritus
Jul 24, 2002
24,764
133
Harrogate
Ok this gonna sound really bad but could you help me change my code to NSURLConnection? I searched and saw the documentation but not really sure how to begin, I'm still in learning progress (finished Learning Objective C 2.0) but waiting for my Beginning Iphone 3.0 Development book, I'm doing this project for learning purposes as I like to learn by trying.

Thanks
Do a search: there have been multiple examples of using the asnyc methods posted.
 

uaecasher

macrumors 65816
Original poster
Jan 29, 2009
1,290
0
Stillwater, OK
by the way, what if I wanted the activity indicator start when upload button is clicked, any idea how to do this?

thanks
 

robbieduncan

Moderator emeritus
Jul 24, 2002
24,764
133
Harrogate
by the way, what if I wanted the activity indicator start when upload button is clicked, any idea how to do this?

thanks
Start it in the IBAction that is called. And make sure you don't block the main thread from that action: if you're going to do something that takes more than a fraction of a second you should not be doing it in an IBAction as it will freeze the whole UI.
 

uaecasher

macrumors 65816
Original poster
Jan 29, 2009
1,290
0
Stillwater, OK
Start it in the IBAction that is called. And make sure you don't block the main thread from that action: if you're going to do something that takes more than a fraction of a second you should not be doing it in an IBAction as it will freeze the whole UI.
same problem the Indicator starts when the Upload button get unhidden not when it get clicked, wondering would it work if I added another IBAction to the button just for the spinner?

Thanks
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.