JSON для отображения текста - Freezing UI - PullRequest
0 голосов
/ 10 февраля 2011

В настоящее время у меня есть очень простое представление, которое отображает информацию из канала JSON. Проблема, с которой я сталкиваюсь, заключается в паузе в несколько секунд, с которой я сталкиваюсь, когда нажимаю эту вкладку. Как я могу сделать так, чтобы это представление загружалось мгновенно, а затем после этого загружались области label.text? Предпочтительнее с индикатором активности?

Должен ли я использовать темы?

Заранее спасибо!

Код:

- (NSString *)stringWithUrl:(NSURL *)url {
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadRevalidatingCacheData timeoutInterval:30];
    NSData *urlData;
    NSURLResponse *response;
    NSError *error;

    urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
    return [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];
    }


- (id)objectWithUrl:(NSURL *)url {
    SBJsonParser *jsonParser = [SBJsonParser new];
    NSString *jsonString = [self stringWithUrl:url];
    return [jsonParser objectWithString:jsonString error:NULL];
    }


- (NSDictionary *)downloadStats {
    id response = [self objectWithUrl:[NSURL URLWithString:@"http://www.example.com/JSON"]];
    NSDictionary *feed = (NSDictionary *)response;
    return feed;
    [feed release];
    }

- (void)viewDidLoad {
    [super viewDidLoad];

    [GlobalStatsScrollView setScrollEnabled:YES];
    [GlobalStatsScrollView setContentSize:CGSizeMake(320, 360)];
}

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"View appears");

    // Download JSON Feed
    NSDictionary *feed = [self downloadStats];      
    totalproduced.text = [feed valueForKey:@"Produced"];
    totalno.text = [feed valueForKey:@"Total"];
    mostcommon.text = [feed valueForKey:@"Most Common"];
    }

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Проблема в том, что -[NSURLConnection sendSynchronousRequest:] блокируется, пока не будет всех данных.

Лучший способ исправить это - реализовать асинхронный запрос (см. Справку NSURLConnection о том, как это сделать).

Вы также можете установить синхронное соединение в фоновом потоке, как предложил Макс, хотя я бы предложил использовать performSelectorInBackground: вместо того, чтобы создавать поток вручную. В любом случае, не забудьте сначала установить NSAutoreleasePool в новом потоке, чтобы избежать утечек, а также помните, что вызов методов GUI (например, установка текста UILabel) должен выполняться в основном потоке, например, с использованием performSelectorOnMainThread:withObject:waitUntilDone:. Как видите, в многопоточной версии есть некоторые подводные камни, поэтому я действительно предлагаю реализовать асинхронное соединение.

1 голос
/ 10 февраля 2011
- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"View appears");

    UIActivityIndicatorView* spiner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge];
    spiner.tag = 123;
    [self.view addSubview: spiner];
    [spiner startAnimating];
    [spiner release];

    NSThread* thread = [[NSThread alloc] initWithTarget: self 
                                               selector: @selector(loadFeed) object: nil];
    [thread start];

}

-(void) loadFeed {
    // Download JSON Feed
    NSDictionary *feed = [self downloadStats];      
    totalproduced.text = [feed valueForKey:@"Produced"];
    totalno.text = [feed valueForKey:@"Total"];
    mostcommon.text = [feed valueForKey:@"Most Common"];

    [[self.view viewWithTag: 123] removeFromSuperview];
}

не забудьте освободить свою ветку после.Вы также должны проверить документы для NSOperationQueue

Другой вариант будет использовать асинхронные запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...