NSURLConnection перезагружает мой взгляд - PullRequest
0 голосов
/ 17 июня 2011

Поэтому я использую делегат 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];
}

1 Ответ

0 голосов
/ 22 июня 2011

Это все в вашем коде:

    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];

Вы создаете новый ListingsViewController и заменяете старый.У нового ListingsViewController еще не загружен вид.(Вам не нужно звонить как -pushViewController:animated: и -setViewControllers:; второй в этом случае переопределяет первый).

Другие вещи:

  • In -hudWasHidden, вы, вероятно, хотите сделать [HUD release]; HUD = nil;.
  • Непонятно, чего пытается достичь [window removeFromSuperview] (это, вероятно, ничего не дает, поскольку окна не имеют суперпредставлений).
...