Отправить массив с беспорядком и целью c - PullRequest
0 голосов
/ 08 мая 2018

Я работаю в небольшом проекте в IOS, который отправляет сообщение json с unirest lib. Запрос содержит массив, который выдает ошибку, и я не знаю, почему.

Это код:

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 длина]: нераспознанный селектор отправлен на экземпляр 0x600000238220 '

1 Ответ

0 голосов
/ 09 мая 2018

Согласно NSURLRequest, который я предполагаю UNIRest использовать в фоновом режиме (или использовать аналогичный подход), поля HTTPHeaders имеют значение NSDictionary<NSString *,NSString *>: NSDictionary, где ключи 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;

Так что вы не можете поместить объект NSArray в качестве значения.iOS ожидает NSString, и это объясняет, что вы получаете эту ошибку:

*** Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSArrayI length]: нераспознанный селектор, отправленный экземпляру0x600000238220 '

Там мы признаем, что вызываемый метод length (NSString basic в Objective-C) пытается вызвать объект NSArray, а не NSStringодин.Так как NSArray не реализует его, это вызывает эту ошибку и сбой.Что может быть трудно сказать, причина в том, что это внутренний скрытый код Какао, который вызывает length (вы сами этого не видите).Но зная, где, и предполагая, что length для объекта NSString, и что преступник также является NSArray объектом, вы можете определить проблему:

NSArray *tags  = @[@"tag1", @"tag2"];
[parameters setValue:tags forKey:@"tags"];

Так что tags необходимобыть NSString объектом, а не NSArray объектом.По вашему мнению, API должен вызываться с использованием JSON Stringified.Итак:

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"];

Как я и предполагал в комментариях, если вашему API нужны теги с разделителями-запятыми:

NSArray *tags = @[@"tag1", @"tag2"];
NSString *tagsString = [tags componentsJoinedByString:@","];
[parameters setValue:tags forKey:@"tags"];
...