2013-05-27 3 views
0

Моя текущая проблема: я успешно извлек данные из веб-службы с помощью SBJSON, а также проанализировал данные в классе с несколькими переменными.Доступ к анализируемым данным JSON от контроллера основного вида iOS

Теперь мой главный контроллер представления должен быть доступ к этим переменным внутри класса, который вытягивает данные из веб-службы, но каждый раз, когда я получить доступ к переменным, все равны нулю или 0.

Я полагаю, что вопрос потому что, когда приложение уже запущено на главный контроллер представления, класс, который извлекает данные с веб-сервера, еще не загружен.

Как это разрешить?

Вот код основного контроллера.

- (void)viewDidLoad 
{ 

    _mainParser = [[MonroeParser alloc] init]; 
    [_mainParser go]; 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UINavigationBar *navBar = [[self navigationController] navigationBar]; 
    navBar.tintColor = [UIColor redColor]; 
    UIImageView* img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Power_One_RedLogo.png"]]; 
    self.navigationItem.titleView = img; 

    UIBarButtonItem *iconButton = [[UIBarButtonItem alloc] initWithTitle:@"View Site" style:UIBarButtonItemStylePlain target:self action:@selector(pushToPowerOneWebsite:)]; 
    self.navigationItem.leftBarButtonItem = iconButton; 


    _DayString.text = @"Thursday"; 
    _DayInteger.text = @"24"; 
    _MonthString.text = @"May"; 
    _SystemStatusIcon.image = [UIImage imageNamed:@"Power_One_RedLogo.png"] ; 
    _SystemStatus.text = @"Normal"; 

    [_StatusButton addSubview:_DayInteger]; 



    NSLog(@"%@", _mainParser.solarStatus); 
    NSLog(@"%@", _mainParser.fields); 
    NSLog(@"%@", _mainParser.type); 
    NSLog(@"%@", _mainParser.field); 
    NSLog(@"%@", _mainParser.label); 
    NSLog(@"%ld", (long)_mainParser.entityID); 
    NSLog(@"%@", _mainParser.entityName); 
    NSLog(@"%@", _mainParser.timeZone); 
    NSLog(@"%@", _mainParser.units); 
    NSLog(@"%@", _mainParser.parameters); 
    NSLog(@"%ld", (long)_mainParser.param_Value); 
    NSLog(@"%@", _mainParser.param_Name); 
    NSLog(@"%ld", (long)_mainParser.start); 
    NSLog(@"%@", _mainParser.startLabel); 
    NSLog(@"%ld", (long)_mainParser.end); 
    NSLog(@"%@", _mainParser.endLabel); 
    NSLog(@"%ld", (long)_mainParser.value); 
} 

Код для моего класса парсера:

- (void) go 
{ 
    adapter = [[SBJsonStreamParserAdapter alloc] init]; 
    adapter.delegate = self; 

    parser = [[SBJsonStreamParser alloc] init]; 
    parser.delegate = adapter; 

    parser.supportMultipleDocuments = YES; 

    NSString *url = myurl; 

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 

    theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
} 

#pragma mark SBJsonStreamParserAdapterDelegate methods 

- (void)parser:(SBJsonStreamParser *)parser foundArray:(NSArray *)array 
{ 
    [NSException raise:@"unexpevted" format:@"Should not get here"]; 
} 


- (void)parser:(SBJsonStreamParser *)parser foundObject:(NSDictionary *)dict 
{ 
    solarStatus = [dict objectForKey:@"status"]; 
    fields = [dict objectForKey:@"fields"]; 
    type = [[dict objectForKey:@"fields"] valueForKey:@"type"]; 
    field = [[dict objectForKey:@"fields"] valueForKey:@"field"]; 
    label = [[dict objectForKey:@"fields"] valueForKey:@"label"]; 
    entityID = [[dict objectForKey:@"fields"] valueForKey:@"entityID"]; 
    entityName = [[dict objectForKey:@"fields"] valueForKey:@"entityName"]; 
    timeZone = [[dict objectForKey:@"fields"] valueForKey:@"entityName"]; 
    units = [[dict objectForKey:@"fields"] valueForKey:@"units"]; 
    parameters = [[dict objectForKey:@"fields"] valueForKey:@"parameters"]; 
    param_Value = [[[dict objectForKey:@"fields"] valueForKey:@"parameters"]valueForKeyPath:@"value"]; 
    param_Name = [[[dict objectForKey:@"fields"] valueForKey:@"parameters"]valueForKeyPath:@"name"]; 
    start = [[dict objectForKey:@"fields"] valueForKey:@"start"]; 
    startLabel = [[dict objectForKey:@"fields"] valueForKey:@"startLabel"]; 
    end = [[dict objectForKey:@"fields"] valueForKey:@"end"]; 
    endLabel = [[dict objectForKey:@"fields"] valueForKey:@"endLabel"]; 
    value = [[dict objectForKey:@"fields"] valueForKey:@"value"]; 



    NSLog(@"%@", solarStatus); 
    NSLog(@"%@", fields); 
    NSLog(@"%@", type); 
    NSLog(@"%@", field); 
    NSLog(@"%@", label); 
    NSLog(@"%ld", (long)entityID); 
    NSLog(@"%@", entityName); 
    NSLog(@"%@", timeZone); 
    NSLog(@"%@", units); 
    NSLog(@"%@", parameters); 
    NSLog(@"%ld", (long)param_Value); 
    NSLog(@"%@", param_Name); 
    NSLog(@"%ld", (long)start); 
    NSLog(@"%@", startLabel); 
    NSLog(@"%ld", (long)end); 
    NSLog(@"%@", endLabel); 
    NSLog(@"%ld", (long)value); 

} 
#pragma mark NSURLConnectionDelegate methods 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSLog(@"Connection didReceiveResponse: %@ - %@", response, [response MIMEType]); 
} 



- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    NSLog(@"Connection didReceiveAuthenticationChallenge: %@", challenge); 

    NSURLCredential *credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession]; 

    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
} 



- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    NSLog(@"Connection didReceiveData of length: %u", data.length); 

    SBJsonStreamParserStatus status = [parser parse:data]; 

    if (status == SBJsonStreamParserError) 
    { 
     solarStatus = [NSString stringWithFormat:@"The parser encountered an error: %@", parser.error]; 
     NSLog(@"Parser error: %@", parser.error); 

    } else if (status == SBJsonStreamParserWaitingForData) { 
     NSLog(@"Parser waiting for more data"); 
    } 
} 



- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); 
} 



- (void)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
    NSLog(@"Connection finished"); 
} 

Выход класса синтаксического анализатора выдает правильные строки с фактическими данными. Но проблема заключается в том, что выдает те же данные в главном контроллере просмотра, все возвращает NULL или 0.

Как я уже сказал, я уверен, что проблема связана с загрузкой контроллера основного представления, прежде чем парсер классов может даже получить ДАННЫЕ объекта JSON im im.

Любая помощь будет отличной !!!

Также я провел некоторое исследование, и мне кажется, что мне может понадобиться реализовать функцию для использования асинхронного вызова веб-службы, из которой я извлекаю DATA, но я очень новичок в таких реализациях.

ВЫВОД

2013-05-27 16:18:26.580 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.585 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.585 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.586 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.586 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.586 PowerOneAuroraApp[14230:c07] 0 
2013-05-27 16:18:26.586 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.587 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.587 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.587 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.588 PowerOneAuroraApp[14230:c07] 0 
2013-05-27 16:18:26.588 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.588 PowerOneAuroraApp[14230:c07] 0 
2013-05-27 16:18:26.603 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.603 PowerOneAuroraApp[14230:c07] 0 
2013-05-27 16:18:26.603 PowerOneAuroraApp[14230:c07] (null) 
2013-05-27 16:18:26.604 PowerOneAuroraApp[14230:c07] 0 
2013-05-27 16:18:27.092 PowerOneAuroraApp[14230:c07] Connection didReceiveResponse: <NSHTTPURLResponse: 0x7539100> - application/json 
2013-05-27 16:18:27.092 PowerOneAuroraApp[14230:c07] Connection didReceiveData of length: 2154 
2013-05-27 16:18:27.094 PowerOneAuroraApp[14230:c07] SUCCESS 
2013-05-27 16:18:27.095 PowerOneAuroraApp[14230:c07] (
     { 
     end = 1369696440000; 
     endLabel = "Mon May 27, 2013 5:14:00 PM MDT"; 
     entityId = 1167815; 
     entityName = "Morone Residence"; 
     field = GenerationPower; 
     label = now; 
     parameters =   (
     ); 
     start = 1369696440000; 
     startLabel = "Mon May 27, 2013 5:14:00 PM MDT"; 
     timeZone = "US/Mountain"; 
     type = instant; 
     units = kilowatts; 
     value = "0.229000000283"; 
    }, 
     { 
     end = 1369696707064; 
     endLabel = 20130527171827; 
     entityId = 1167815; 
     entityName = "Morone Residence"; 
     field = GenerationEnergy; 
     label = today; 
     parameters =   (
         { 
       name = "DataItem.now.maxCacheAge"; 
       value = 60; 
      } 
     ); 
     sampleEnd = 1369692840000; 
     sampleEndLabel = 20130527161400; 
     sampleStart = 1369634340000; 
     sampleStartLabel = 20130526235900; 
     start = 1369634400000; 
     startLabel = 20130527000000; 
     timeZone = "US/Mountain"; 
     type = window; 
     units = "kilowatt-hours"; 
     value = "7.95501708984"; 
    }, 
     { 
     end = 1369696707064; 
     endLabel = 20130527171827; 
     entityId = 1167815; 
     entityName = "Morone Residence"; 
     field = GenerationEnergy; 
     label = week; 
     parameters =   (
         { 
       name = "DataItem.now.maxCacheAge"; 
       value = 60; 
      } 
     ); 
     sampleEnd = 1369692840000; 
     sampleEndLabel = 20130527161400; 
     sampleStart = 1369547940000; 
     sampleStartLabel = 20130525235900; 
     start = 1369548000000; 
     startLabel = 20130526000000; 
     timeZone = "US/Mountain"; 
     type = window; 
     units = "kilowatt-hours"; 
     value = "16.60800170898"; 
    }, 
     { 
     end = 1369696707064; 
     endLabel = 20130527171827; 
     entityId = 1167815; 
     entityName = "Morone Residence"; 
     field = GenerationEnergy; 
     label = month; 
     parameters =   (
         { 
       name = "DataItem.now.maxCacheAge"; 
       value = 60; 
      } 
     ); 
     sampleEnd = 1369692840000; 
     sampleEndLabel = 20130527161400; 
     sampleStart = 1367387940000; 
     sampleStartLabel = 20130430235900; 
     start = 1367388000000; 
     startLabel = 20130501000000; 
     timeZone = "US/Mountain"; 
     type = window; 
     units = "kilowatt-hours"; 
     value = "269.87199401855"; 
    }, 
     { 
     end = 1369692840000; 
     endLabel = "Mon May 27, 2013 4:14:00 PM MDT"; 
     entityId = 1167815; 
     entityName = "Morone Residence"; 
     field = GenerationEnergy; 
     label = lifetime; 
     parameters =   (
     ); 
     start = 1369692840000; 
     startLabel = "Mon May 27, 2013 4:14:00 PM MDT"; 
     timeZone = "US/Mountain"; 
     type = instant; 
     units = "kilowatt-hours"; 
     value = "1609.48400878906"; 
    } 
) 
2013-05-27 16:18:27.097 PowerOneAuroraApp[14230:c07] (
    instant, 
    window, 
    window, 
    window, 
    instant 
) 
2013-05-27 16:18:27.098 PowerOneAuroraApp[14230:c07] (
    GenerationPower, 
    GenerationEnergy, 
    GenerationEnergy, 
    GenerationEnergy, 
    GenerationEnergy 
) 
2013-05-27 16:18:27.098 PowerOneAuroraApp[14230:c07] (
    now, 
    today, 
    week, 
    month, 
    lifetime 
) 
2013-05-27 16:18:27.098 PowerOneAuroraApp[14230:c07] 124196320 
2013-05-27 16:18:27.099 PowerOneAuroraApp[14230:c07] (
    "Morone Residence", 
    "Morone Residence", 
    "Morone Residence", 
    "Morone Residence", 
    "Morone Residence" 
) 
2013-05-27 16:18:27.099 PowerOneAuroraApp[14230:c07] (
    "Morone Residence", 
    "Morone Residence", 
    "Morone Residence", 
    "Morone Residence", 
    "Morone Residence" 
) 
2013-05-27 16:18:27.099 PowerOneAuroraApp[14230:c07] (
    kilowatts, 
    "kilowatt-hours", 
    "kilowatt-hours", 
    "kilowatt-hours", 
    "kilowatt-hours" 
) 
2013-05-27 16:18:27.104 PowerOneAuroraApp[14230:c07] (
     (
    ), 
     (
       { 
      name = "DataItem.now.maxCacheAge"; 
      value = 60; 
     } 
    ), 
     (
       { 
      name = "DataItem.now.maxCacheAge"; 
      value = 60; 
     } 
    ), 
     (
       { 
      name = "DataItem.now.maxCacheAge"; 
      value = 60; 
     } 
    ), 
     (
    ) 
) 
2013-05-27 16:18:27.105 PowerOneAuroraApp[14230:c07] 124196576 
2013-05-27 16:18:27.105 PowerOneAuroraApp[14230:c07] (
     (
    ), 
     (
     "DataItem.now.maxCacheAge" 
    ), 
     (
     "DataItem.now.maxCacheAge" 
    ), 
     (
     "DataItem.now.maxCacheAge" 
    ), 
     (
    ) 
) 
2013-05-27 16:18:27.106 PowerOneAuroraApp[14230:c07] 124196720 
2013-05-27 16:18:27.106 PowerOneAuroraApp[14230:c07] (
    "Mon May 27, 2013 5:14:00 PM MDT", 
    20130527000000, 
    20130526000000, 
    20130501000000, 
    "Mon May 27, 2013 4:14:00 PM MDT" 
) 
2013-05-27 16:18:27.106 PowerOneAuroraApp[14230:c07] 124196784 
2013-05-27 16:18:27.106 PowerOneAuroraApp[14230:c07] (
    "Mon May 27, 2013 5:14:00 PM MDT", 
    20130527171827, 
    20130527171827, 
    20130527171827, 
    "Mon May 27, 2013 4:14:00 PM MDT" 
) 
2013-05-27 16:18:27.107 PowerOneAuroraApp[14230:c07] 124196848 
2013-05-27 16:18:27.107 PowerOneAuroraApp[14230:c07] Parser waiting for more data 
2013-05-27 16:18:27.107 PowerOneAuroraApp[14230:c07] Connection finished 

ответ

1

Вы не должны делать это. Вы никогда не сможете получить информацию из URL-адреса, прежде чем вы захотите его прочитать, если вы не сделаете его синхронным, что означает, что у вас будет U U-файл, который застрял в viewdidload до его завершения, что является ужасной практикой.

Я не знаком с SBJSON, но, скорее всего, он имеет либо вызов метода делегата, либо блок обработчика завершения, вы должны обрабатывать извлеченную информацию там.

Редактировать: На самом деле я плохой, я не понимал, что вы используете NSURLConnection для получения данных json. Плюс я вижу в вашем коде несколько других странных вещей.

Все, что вам нужно сделать, это проверить документацию на яблоко here и осуществить: connectionDidFinishLoading в вашем основном контроллере.

После получения ответа данных JSON вы должны предоставить его вашему парсеру, а затем вы можете использовать эту информацию.

В этом коде я не вижу вашего делегата подключения и где бы вы ни направляли эти данные вашему парсеру.

Как this:

SBJsonParser *jsonParser = [[SBJsonParser alloc] init]; 
NSError *error = nil; 
NSArray *jsonObjects = [jsonParser objectWithString:jsonString error:&error]; 
[jsonParser release], jsonParser = nil; 

Но в журнал, кажется, так я предполагаю, что вы правильно делаете это.

Проверьте журнал,

Подключение didReceiveResponse:

появляется после запроса данных, поэтому Нет ничего до появления этого вызова. Переместите любой код, который вы используете, для анализа информации на этот метод.

+0

Это то, что я полагал, что должен был сделать, но я очень новичок в объектах JSON и занимаюсь такими обратными вызовами и блоками обработчика завершения. Если у кого-нибудь есть примеры того, как это сделать ... Я бы очень признателен! Я ссылался на документацию SBJSON api, но, как я уже сказал, я новичок, и пример, который поможет мне в курсе, будет очень полезен. Надеюсь, у кого-то еще была такая же проблема и она была решена, поэтому мне не придется брать часы, если не дни, чтобы решить эту проблему. – jsetting32

+0

check edit, так как это не ваш полный код, я не уверен, как вы это делаете, но я думаю, что исправление очень простое. (перемещайте свой код с любого из них на вызов делегата didfinishloading) – Pochi

Смежные вопросы