我正在IOS的一个小项目中工作,该项目使用unirest lib发送json消息。该请求包含一个数组,它给出了错误,我不知道为什么。
这是代码:
NSMutableDictionary * parameters = [[NSMutableDictionary alloc] init];
NSString *valueMd5 = @"examplemd5file";
[parameters setValue:valueMd5 forKey:@"md5file"];
NSString *path = @"pathfile";
[parameters setValue:path forKey:@"path"];
float latitude = 1.0f;
NSString *strLatitude = [NSString stringWithFormat:@"%f", latitude];
[parameters setValue:strLatitude forKey:@"latitude"];
float longitude = 1.0f;
NSString *strLongitude = [NSString stringWithFormat:@"%f", longitude];
[parameters setValue:strLongitude forKey:@"longitude"];
int image_width = 100;
NSString *strImageWidth = [NSString stringWithFormat:@"%d", image_width];
[parameters setValue:strImageWidth forKey:@"image_width"];
int image_height = 100;
NSString *strImageHeight = [NSString stringWithFormat:@"%d", image_height];
[parameters setValue:strImageHeight forKey:@"image_height"];
//"dd-MM-yyyy HH:mm:ss"
NSString *data_taken = @"11-12-1111 12:12:12";
[parameters setValue:data_taken forKey:@"data_taken"];
NSArray *tags = @[@"tag1", @"tag2"];
// tags = @[NSArray arrayWithObjects:@"tag1", @"tag2"];
[parameters setValue:tags forKey:@"tags"];
NSString* iaError = @"Error description";
[parameters setValue:iaError forKey:@"iaError"];
NSString *token = @"5aecf374c3dc09.43880964";
NSString* complete_url = [NSString stringWithFormat:@"%@/api/batch/metadata/%@", URL_BASE, token];
[[UNIRest post:^(UNISimpleRequest *request) {
[request setUrl:complete_url];
[request setHeaders:headers];
[request setParameters:parameters];
}] asJsonAsync:^(UNIHTTPJsonResponse* response, NSError *error) {
// This is the asyncronous callback block
NSInteger code = response.code;
NSDictionary *responseHeaders = response.headers;
UNIJsonNode *body = response.body;
NSData *rawBody = response.rawBody;
}];
这就是错误:
2018-05-08 18:09:28.063517 + 0200 tflite_simple_example [6600:187624] - [__ NSArrayI length]:无法识别的选择器发送到实例0x600000238220 2018-05-08 18:09:28.073351 + 0200 tflite_simple_example [6600:187624] ***由于未被捕获而终止应用程序 异常'NSInvalidArgumentException',原因:' - [__ NSArrayI length]: 无法识别的选择器发送到实例0x600000238220'
答案 0 :(得分:0)
根据NSURLRequest
,我猜UNIRest
在后台使用(或使用类似方法),HTTPHeaders字段为NSDictionary<NSString *,NSString *>
:NSDictionary
其中键为{{1}其中值为NSString
。
请参阅NSString
或NSURLRequest
的相应方法/属性。
NSMutableURLRequest
因此,您无法将@property(readonly, copy) NSDictionary<NSString *,NSString *> *allHTTPHeaderFields;
- (NSString *)valueForHTTPHeaderField:(NSString *)field;
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
- (void)addValue:(NSString *)value
forHTTPHeaderField:(NSString *)field;
对象作为值。 iOS期望一个NSString,这可以解释你得到这个错误:
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSArrayI length]: 无法识别的选择器发送到实例0x600000238220'
在那里,我们认识到调用的方法是NSArray
(在Objective-C中基本为length
},试图在NSString
对象上调用而不是NSArray
一。由于NSString
没有实现它,因此导致该错误并崩溃。
可能很难说出原因是因为它是一个内部隐藏的Cocoa代码,它调用NSArray
(你自己没有看到它)。但是知道在哪里,假设length
是length
个对象,并且罪魁祸首也是NSString
对象,可以帮助您查明问题:
NSArray
所以NSArray *tags = @[@"tag1", @"tag2"];
[parameters setValue:tags forKey:@"tags"];
需要是tags
个对象,而不是NSString
个。
根据您的说法,需要使用JSON Stringified来调用API。
所以:
NSArray
正如我在评论中所假设的,如果您的API需要以逗号分隔的标记:
NSArray *tags = @[@"tag1", @"tag2"];
NSData *tagsJSONData = [NSJSONSerialization dataWithJSONObject:tags options:0 error:nil]; //Might be useful to use a `NSError` object just in case
NSString *tagsJSONString = [[NSString alloc] initWithData:tagsJSONData encoding:NSUTF8StringEncoding];
[parameters setValue:tags forKey:@"tags"];