我有一个NSDictionary,我在代码中用两种不同的方法读取了一些值,但只有一种方法才能正确检索键的值,而在另一种方法中我总是为零。
这是有效的方法:
-(void)drawDriver:(NSString*)driverId withPosition:(CLLocationCoordinate2D)position withRotation:(float)bearing isAvailable:(BOOL)isDriverAvailable{
GMSMarker *driverMarker = [driversList objectForKey:driverId];
if (driverMarker != nil) {
// do some work
}
}
并且从另一种方法调用它:
- (void) socketIO:(SocketIO *)socket didReceiveMessage:(SocketIOPacket *)packet
{
NSMutableDictionary *datos = (NSMutableDictionary*)packet.data;
NSDictionary *driverId = datos[@"from"];
NSString *id = [driverId objectForKey:@"id"];
//gets other values
NSLog(@"Socket message: driverId: %@, position %f,%f, isAvailable:%d", id, latitude, longitude, isDriverAvailable);
//Call the first method
[self drawDriver:id withPosition:position withRotation:bearing isAvailable:isDriverAvailable];
}
这是不起作用的方法(对于driverMarker返回nil):
-(void)updateMapForTripWithDriver:(NSString *)driverId {
GMSMarker *driverMarker = [driversList objectForKey:driverId];
if (driverMarker != nil) {
//do some work
}
}
这是从这里调用的:
- (void)updateTripWithData:(NSDictionary *)data {
//This NSDictionary comes from a notification
NSString *newStatus = [[data objectForKey:@"aps"] objectForKey:@"alert"];
if ([newStatus isEqualToString:NO_TRIP]) {
} else if ([newStatus isEqualToString:WAITING_CONFIRMATION]) {
} else if ([newStatus isEqualToString:DRIVER_ON_THE_WAY]) {
//Get the driverId and call the other method
NSString *driverId = [data objectForKey:@"driver_id"];
[self updateMapForTripWithDriver:driverId];
}
}
正如您所看到的,两种方法都具有完全相同的代码来检索对象但仍然得到不同的结果。 我能找到的唯一区别是当我在方法上放置一些断点时,这就是我发现的:
在第一种方法中,虽然我将driverId作为NSString传递,但不知怎的,它被读作NSFCNumber并且似乎有效,因为我得到了没有问题的值。
但是在第二种方法中,键被读作实际的NSString,由于某种原因,该方法使得该方法为NSDictionary上存在的对象返回nil。
如何让第二种方法起作用并返回正确的值?