0

我当前的问题是我已经成功地使用 SBJSON 从 Web 服务获取数据,并将数据解析为具有多个变量的类。

现在,我的主视图控制器应该访问从 Web 服务中提取数据的类中的那些变量,但是每次我访问这些变量时,都是 null 或 0。

我认为这个问题是因为当应用程序已经启动到主视图控制器时,从 Web 服务器中提取数据的类还没有加载。

我该如何解决这个问题?

这是主视图控制器的代码。

- (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");
}

类解析器的输出输出带有实际 DATA 的正确字符串。但问题是当在主视图控制器中输出相同的数据时,一切都返回 NULL 或 0。

就像我说的那样,我确定问题在于在类解析器甚至可以检索我获取的 JSON 对象的 DATA 之前加载主视图控制器。

任何帮助都会很棒!!!

我也做了一些研究,似乎我可能需要实现一个函数来使用异步调用我从中获取数据的 Web 服务,但我对这种实现非常陌生。

输出

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
4

2 回答 2

1

请查看 TweetStream 示例项目,了解如何使用 SBJson 异步解析 JSON:https ://github.com/stig/json-framework/blob/master/Examples/TweetStream/TweetStream/TweetStreamViewController.m - 绝对支持。

于 2013-06-22T22:52:53.587 回答
1

你不应该这样做。在你想阅读之前,你永远无法从 URL 中获取信息,除非你让它同步,这意味着你的 UI 会一直停留在 viewdidload 中,直到它完成,这是一种糟糕的做法。

我不熟悉 SBJSON,但它很可能有一个委托方法调用或一个完成处理程序块,您应该在那里处理检索到的信息。

编辑:其实我的错,我没有意识到你正在使用 NSURLConnection 来获取 json 数据。另外,我可以在您的代码中看到其他一些奇怪的东西。

您所要做的就是在此处查看苹果文档并在您的主控制器中实现:connectionDidFinishLoading 。

获得 JSON 数据的响应后,您应该将其提供给解析器,然后您就可以使用该信息。

在这段代码中,我看不到您的连接委托,也看不到您将此数据提供给解析器的任何地方。

这样

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

但是在日志中它出现了,所以我假设你这样做是正确的。

检查日志,

连接didReceiveResponse:

在您请求数据之后出现,因此在此调用出现之前没有任何内容。将您用于解析信息的任何代码移动到该方法。

于 2013-05-28T00:40:14.383 回答