问题很简单,但我看到实施相当尴尬!!
我想发布一个对象,例如Web api Web服务的设备对象
// Initialize Client
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://rezawebapi.com"]];
//Indicationg this device is online and sending its dEVICE token to the server
Device *device = [Device new];
device.DeviceToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"devicetoken"];
device.IsOnline = @"True";
//updating current active users of this app in the server
NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:
device.DeviceToken,@"DeviceToken",
device.IsOnline,@"IsOnline",
nil];
client.parameterEncoding = AFJSONParameterEncoding;
[client postPath:@"/api/iosAppstats" parameters:dictionary success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"%@", responseObject);
// it crashes on the next line because responseObject is NSData
}failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"%@", error.localizedDescription);
}];
1-无论如何都要发送对象而不创建字典?(这很容易出错!)
2-当我的deviceToken为null时,它发送给服务器的对象为null。但是在这里考虑一个属性deviceToken
为null,但其他属性有自己的值!有没有人有任何想法?
3-我已定义@property (assign, nonatomic) BOOL IsOnline;
但是当它创建字典时EXEX-BAD-ACCESS
上升!我该如何定义bool值? (我不得不将其定义为NSString。它不是一种批准的方式)
答案 0 :(得分:1)
无论如何都要发送对象而不创建字典?(这很容易出错!)
您的API需要JSON。 JSON只是字典,数组,字符串和数字。所以不行。但是,它不容易出错。只需确保只在您的字典中放入符合JSON的对象。请阅读the NSJSONSerialization Overview了解详情。
当我的deviceToken为null时,它发送给服务器的对象为null。但是在这里考虑一个属性deviceToken是null但其他属性有自己的值!有没有人有任何想法?
您可以有条件地添加deviceToken
,如下所示:
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
NSString *deviceToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"devicetoken"];
if (deviceToken) {
[dictionary setObject:deviceToken forKey:@"DeviceToken"];
}
我定义了@property(assign,nonatomic)BOOL IsOnline;但是当它创建字典EXEX-BAD-ACCESS上升!我该如何定义bool值? (我不得不将其定义为NSString。它不是一种批准的方式)
使用BOOL违反了我在#1中链接的NSJSONSerialization概述中的这条规则:
所有对象都是
NSString
,NSNumber
,NSArray
,NSDictionary
或NSNull
的实例。
因此,如果您的属性是BOOL
或其他简单数字类型,请将其包装在@()
中以使其成为NSNumber:
[dictionary setObject:@(device.IsOnline) forKey:@"DeviceToken"];
这与:
相同NSNumber *isOnlineNum = [NSNumber numberWithBool:device.isOnline];
[dictionary setObject:isOnlineNum forKey:@"DeviceToken"];