发送具有动乱和目标c的数组

时间:2018-05-08 16:12:26

标签: ios objective-c unirest

我正在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'

1 个答案:

答案 0 :(得分:0)

根据NSURLRequest,我猜UNIRest在后​​台使用(或使用类似方法),HTTPHeaders字段为NSDictionary<NSString *,NSString *>NSDictionary其中键为{{1}其中值为NSString

请参阅NSStringNSURLRequest的相应方法/属性。

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(你自己没有看到它)。但是知道在哪里,假设lengthlength个对象,并且罪魁祸首也是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"];