Поэтому я использую делегат NSURLConnection для загрузки JSON-фида в мой файл AppDelegate.m.Теперь у меня проблема.Мое приложение: didFinishLaunchingWithOptions показано ниже:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Display the progress indicator
HUD = [[MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES] retain];
// Start the HTTP request
responseData = [[NSMutableData data] retain];
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"*****some url here*********"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
// Display the navigation controller
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
Поэтому все, что я делаю, это отображаю индикатор активности, запускаю HTTP-запрос (то есть когда начинает работать делегат NSURLConnection), а затемЯ отображаю корневой контроллер моего навигационного контроллера.Теперь проблема в том, что он загрузит это представление, которое имеет табличное представление, без каких-либо данных в нем (поскольку NSURLConnection) не завершило загрузку данных.Это выглядит довольно некрасиво, потому что у меня есть статические UILabels, которые я сделал на конструкторе интерфейсов, поэтому он отображает их, а затем после загрузки показывает данные.В середине экрана у меня есть индикатор активности, поэтому пользователь всегда знает, что загружаются новые данные.
Теперь, после того как мое NSURLConnection завершает загрузку данных, представление загружается еще раз по какой-то странной причине.Я знаю это потому, что если я поставлю NSLog (@ "Test");в моем методе viewDidLoad он печатается дважды.В конце приложения: didFinishLaunchingWithOptions и в конце connectionDidFinishLoading.Это почему?Как сделать так, чтобы представление загружалось один раз после загрузки моих данных?Есть предложения?
Спасибо всем,
РЕДАКТИРОВАТЬ: больше кода в AppDelegate перед применением: didFinishLaunchingWithOptions
- (void)hudWasHidden {
// Remove HUD from screen when the HUD was hidded
[HUD removeFromSuperview];
[HUD release];
}
#pragma mark -
#pragma mark NSURLConnectionDelegete
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"Starting Response");
[responseData setLength:0];
expectedLength = [response expectedContentLength];
currentLength = 0;
// Change the progress indicator to the loading wheel
HUD.mode = MBProgressHUDModeDeterminate;
NSLog(@"Done Response");
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"Starting Data");
[responseData appendData:data];
currentLength += [data length];
// Calculate progress indicator progress
HUD.progress = currentLength / (float)expectedLength;
NSLog(@"Done Data");
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"Start Error");
[HUD hide:YES];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Error"
message:@"Please check your network connection and relaunch the application"
delegate:self
cancelButtonTitle:@"Dismiss"
otherButtonTitles:nil, nil];
[alert show];
[alert release];
[connection release];
NSLog(@"Done Error");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Start Finish Loading");
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
if ([responseString isEqualToString:@"Unable to find specified resource."]) {
NSLog(@"Unable to find specified resource.n");
}
else {
ListingsViewController *listingsViewController = [[ListingsViewController alloc] initWithNibName:@"ListingsViewController" bundle:nil];
listingsViewController.jsonData = responseString;
[self.navigationController pushViewController:listingsViewController animated:NO];
[self.navigationController setViewControllers:[NSArray arrayWithObject:listingsViewController] animated:NO];
[listingsViewController release];
}
// Save the pList to the Documents directory in iOS
ListingsViewController *listingsViewController = (ListingsViewController *)[self.navigationController topViewController];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
NSString *plistFilePathInDocumentsDirectory = [documentsDirectoryPath stringByAppendingPathComponent:@"Channels.plist"];
// Instantiate a modifiable array and initialize it with the content of the plist file
NSMutableDictionary *channelsData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistFilePathInDocumentsDirectory];
if (!channelsData) {
NSString *plistFilePathInMainBundle = [[NSBundle mainBundle] pathForResource:@"Channels" ofType:@"plist"];
// Instantiate a modifiable array and initialize it with the content of the plist file in main bundle
channelsData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistFilePathInMainBundle];
}
// Set the ListingsViewController's's savedChannels array
listingsViewController.channelsDict = channelsData;
[channelsData release];
// Display progress indicator checkmark and hide
HUD.customView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]] autorelease];
HUD.mode = MBProgressHUDModeCustomView;
[HUD hide:YES afterDelay:1];
[connection release];
[responseData release];
NSLog(@"Done finish loading");
[window removeFromSuperview];
}