我当前的问题是我已经成功地使用 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