Reputation: 6164
In an iPhone app I have integrated flow cover. I am loading images into flow cover from web server.
Till the time images downloading i am passing image count= 0 and uiimage= null
Here I am not downloading images on methods like viewdidload or viewwillAppear actually I have created separate thread for downloading and parsing so it would not take time to load that view.
When downloading completes and if touches the screen it is showing all images but I want to display images on download completes.
How to make images visible without any touch effect programmatically?
Upvotes: 0
Views: 1573
Reputation: 16864
Use ASIHTTP Download Api From http://allseeing-i.com/ASIHTTPRequest/
Then that integrate into project
In Following Code Put into .h File
#import <UIKit/UIKit.h>
#import "AFOpenFlowView.h"
#import "ASINetworkQueue.h"
#import "ASIHTTPRequest.h"
@interface cfDemoViewController : UIViewController <AFOpenFlowViewDataSource, AFOpenFlowViewDelegate> {
ASINetworkQueue *queue;
NSArray *coverImageData;
}
@property (nonatomic, retain) NSArray *arX;
- (void)imageDidLoad:(NSArray *)arguments;
-(void)requestForImage:(NSUInteger)index;
@end
And Following Code Put into .m file
#import "UIImageExtras.h"
#import "cfDemoViewController.h"
#import "UIImageExtras.h"
@implementation cfDemoViewController
@synthesize arX = _arX;
- (void)dealloc
{
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *ar=[NSArray arrayWithObjects:@"http://google.com/report_image/2/17",
@"http://google.com/report_image/2/16",
@"http://google.com/report_image/2/15",
@"http://google.com/report_image/2/14",
@"http://google.com/report_image/2/13",
@"http://google.com/report_image/2/12",
@"http://google.com/report_image/2/11",
@"http://google.com/report_image/2/10",
@"http://google.com/report_image/2/9",
@"http://google.com/report_image/2/8",nil];
self.arX=ar;
queue=[[ASINetworkQueue alloc] init];
for (int i=0; i < [ar count]; i++) {
[(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:@"default.png"] forIndex:i];
}
[self requestForImage:0];
[(AFOpenFlowView *)self.view setNumberOfImages:10];
}
-(void)requestForImage:(NSUInteger)index{
if(index>=[self.arX count]) return;
ASIHTTPRequest *req=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:[self.arX objectAtIndex:index]]];
[req setDidFinishSelector:@selector(requestDone:)];
[req setDidFailSelector:@selector(requestWentWrong:)];
[req setUsername:[NSString stringWithFormat:@"%i",index]];
[req setDelegate:self];
[queue addOperation:req];
[queue go];
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSUInteger index=[[request username] intValue];
UIImage *img=[UIImage imageWithData:[request responseData]];
img=[img cropCenterAndScaleImageToSize:CGSizeMake(225, 225)];
[(AFOpenFlowView*)self.view setImage:img forIndex:index];
[self requestForImage:index+1];
// here all requests are downloaded and you want display any msg to user that code goes here.
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
// NSError *error = [request error];
NSUInteger index=[[request username] intValue];
[self requestForImage:index+1];
}
- (void)imageDidLoad:(NSArray *)arguments {
UIImage *loadedImage = (UIImage *)[arguments objectAtIndex:0];
NSNumber *imageIndex = (NSNumber *)[arguments objectAtIndex:1];
// Only resize our images if they are coming from Flickr (samples are already scaled).
// Resize the image on the main thread (UIKit is not thread safe).
loadedImage = [loadedImage cropCenterAndScaleImageToSize:CGSizeMake(225, 225)];
[(AFOpenFlowView *)self.view setImage:loadedImage forIndex:[imageIndex intValue]];
}
- (UIImage *)defaultImage {
return [UIImage imageNamed:@"default.png"];
}
- (void)openFlowView:(AFOpenFlowView *)openFlowView requestImageForIndex:(int)index{
NSLog(@"request for index - %d",index);
}
- (void)openFlowView:(AFOpenFlowView *)openFlowView selectionDidChange:(int)index {
NSLog(@" Hello - Cover Flow selection did change to %d", index);
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
// return (interfaceOrientation == UIInterfaceOrientationPortrait);
return YES;
}
@end
Upvotes: 1
Reputation: 3305
This might help you recognize the end of download. Since NSURLConnection downloading is async, you can use notification to mark when the download is finished and start your method.
Add observer for NSNotifications:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(some_method:) name:@"some_name" object:nil];
In finished download send the notification:
- (void) connectionDidFinishLoading:(NSURLConnection *)connection {
[[NSNotificationCenter defaultCenter]
postNotificationName:@"some_name" object:nil];
}
And that will start the method:
-(void)some_method {
// add downloaded image to set or smth
}
Upvotes: 1