【问题标题】:Send NSMutableArray of NSMutableDictionary data using NSURLRequest使用 NSURLRequest 发送 NSMutableDictionary 数据的 NSMutableArray
【发布时间】:2018-07-24 05:07:17
【问题描述】:

这是我的请求正文

[
    {
    "DealId":677304,
    "CustomerId":328702,
    "CouponQtn":1,
    "PaymentType":"MPD",
    "CustomerMobile":"01670234032",
    "CustomerAlternateMobile":"01670234032",
    "CustomerBillingAddress":"IT test order.......",
    "Sizes":"not selected",
    "Color":"",
    "DeliveryDist":62,
    "CardType":"Manual",
    "OrderFrom":"iOS",
    "MerchantId":14025,
    "OrderSource":"app",
    "AdvPaymentType":0,
    "AdvPayPhoneId":0,
    "deliveryCharge":45,
    "OrderCouponPrice":500

    }

]

我正在尝试在 Restful api 中使用 NSURLRequest 发送 NSMutableDictionary 数据的 NSMutableArray,但我的应用程序遇到了异常,例如

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayM bytes]: unrecognized selector sent to instance 0x600000855e40”。

我的解析代码:

    -(NSDictionary*)getDataByPOST:(NSString*)url parameter:(id)parameter{

    NSDictionary *dictionaryData;
    NSDictionary *dic;
    Reachability *reachTest = [Reachability reachabilityWithHostName:@"www.apple.com"];
    NetworkStatus internetStatus = [reachTest  currentReachabilityStatus];
    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)){
        dictionaryData = [[NSDictionary alloc] initWithObjectsAndKeys:@"error",@"status",@"No Network",@"message",nil];
        dic = [NSDictionary dictionaryWithObjectsAndKeys:dictionaryData, @"response",nil];
        return dic;
    }

    else{


        NSURL *s =[self getAbsoluteURL:url];
        NSMutableURLRequest *requestURL = [NSMutableURLRequest requestWithURL:s cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:900.00];
        //NSLog(@"%@",requestURL);
        [requestURL setHTTPMethod:@"POST"];


        NSError *error=nil ;
        if ([parameter isKindOfClass : [NSString class]]) {
            [requestURL setHTTPBody:[parameter dataUsingEncoding:NSUTF8StringEncoding]];
        }
        else if([parameter isKindOfClass:[NSDictionary class]]) {
            [requestURL setHTTPBody:parameter];
        }
        else {
            [requestURL setHTTPBody:parameter];
        }
        NSHTTPURLResponse *response;
        NSError *error1=nil;
//        NSLog(@"%@\n\n%@",s,parameter);
        NSData *apiData = [NSURLConnection sendSynchronousRequest:requestURL returningResponse:&response error:&error1];
        if (!apiData) {
            NSLog(@"Error: %@", [error localizedDescription]);
            return NO;
        }

        if (response.statusCode == 0) {

            dictionaryData = [[NSDictionary alloc] initWithObjectsAndKeys:@"error",@"status",@"Server Error",@"message",nil];
            return dic;

        }
        else if(response.statusCode == 404) {
            dictionaryData= [[NSDictionary alloc] initWithObjectsAndKeys:@"error",@"status",@"Server is Currently Down.",@"message", nil];
            return dic;

        }
        else {
            dictionaryData = [NSJSONSerialization JSONObjectWithData:apiData options:0 error:&error];
        }
    }
    return dictionaryData;
}

这是我的api调用代码

 tempDic = [apiCom getNodeDataByPOST:CART_ORDER_URL parameter:orderArray];

这里 orderArray 是 NSMutableArrray 包含 NSMutableDictionary 对象。

谢谢

【问题讨论】:

  • 我不建议使用NSURLConnection(已弃用),也不建议使用sendSynchronousRequest:,因为它是同步的,因此会阻塞。请改用NSURLSession。关于您的问题,您知道哪条线路导致崩溃吗?因为在某些时候,您的代码认为它正在操作 NSData 对象,而实际上它是 NSMutableArray,这会导致崩溃和错误消息。这是您的工作:始终尝试找出问题所在。
  • 现在,有两个问题:[requestURL setHTTPBody:parameter];Parameter 需要是 NSData 对象(与错误一致)。 XCode 甚至不会向您发出警告吗?如果parameterNS(Mutable)Dictionary 也不是NS(Mutable)Array,则不能这样做。我不知道您的 API 要求/规范,但我猜您需要使用 NSJSONSerialization 将该参数转换为 JSON NSData[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameter options:0 error:nil]];
  • 你不能发送NS类;您需要将它们序列化为数据。尝试转换为 NSData 并发送;最有可能编码 UTF8,但取决于您的服务器

标签: objective-c json nsurlsession restful-url nsurlrequest


【解决方案1】:

你得到了错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM bytes]: unrecognized selector sent to instance 0x600000855e40'.

这意味着在您的代码中的某个时刻,您认为可以在拥有它的对象上使用 bytes 方法(getter),但实际上该对象是 NSMutableArray 之一,因为它没有实施bytes,您的代码会因该错误而崩溃。现在,bytes 是例如 NSData 方法。我会回来的。

作为开发人员,您需要找到导致崩溃的行。即使您不理解它,如果您查明问题,其他人可能会更乐意提供帮助,因为他们可以专注于问题,而不会浪费时间查看大部分代码以希望找到问题。即使不是为别人,也要为你做。 这不是负面评论,而是提示。

罪魁祸首:

if ([parameter isKindOfClass : [NSString class]]) {
    [requestURL setHTTPBody:[parameter dataUsingEncoding:NSUTF8StringEncoding]];
}
else if([parameter isKindOfClass:[NSDictionary class]]) {
    [requestURL setHTTPBody:parameter];
}
else {
    [requestURL setHTTPBody:parameter];
}

NSMutableURLRequest的文档:

@property(copy) NSData *HTTPBody;

很明显,如果parameterNSDictionaryNSArray,您将遇到同样的崩溃,其中一个是:-[__NSDictionary bytes]: unrecognized selector sent to instance(或类似的,在某处带有IM在类名中为 Mutable/Immutable 或 Single 用于优化的 Dictionary/Array 等)

现在,这取决于您的 Web API 的文档: 一个常见的用法是使用 JSON:

else if([parameter isKindOfClass:[NSDictionary class]] || [parameter isKindOfClass:[NSArray class]]) {
    [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameter options:0 error:nil]];
}

我将nil 用于error,但在失败的情况下检查它的值可能会很有趣。

【讨论】:

    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多