libc ++ abi.dylib:以NSException类型的未捕获异常终止Alamofire

时间:2018-03-26 13:14:53

标签: swift alamofire userdefaults

我正在使用alamofire将图像发送到服务器。如果参数;

    let parameters: Parameters = [
        "userID": "1",
        "acToken": "acToken"
    ]

工作但参数;

    let parameters: Parameters = [
        "userID": userID,
        "acToken": acToken ?? ""
    ]

不工作。 error = libc ++ abi.dylib:以NSException类型的未捕获异常终止

我正在使用swift4,alamofire 4,Xcode 9.2

我的上传方式:

func profilePhotoUpload(){
        let defaults = UserDefaults.standard
        let userID = defaults.integer(forKey: "userID")
        let acToken = defaults.string(forKey: "acToken")
        print("\(userID) - \(acToken ?? "")")

            // add UI related changes here
            let image = self.profilePhoto.image

            let parameters: Parameters = [
                "userID": userID,
                "acToken": acToken ?? ""
            ]

            Alamofire.upload(multipartFormData: { (multipartFormData) in
                multipartFormData.append(UIImageJPEGRepresentation(image!, 1)!, withName: "photo_path", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
                for (key, value) in parameters {
                    multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
                }
            }, to:"http......")
            { (result) in
                switch result {
                case .success(let upload, _, _):

                    upload.uploadProgress(closure: { (progress) in
                        //Print progress
                    })

                    upload.responseJSON { response in
                        print(response.result)
                        //print response.result
                    }

                case .failure(let encodingError):
                    print(encodingError.localizedDescription)
                    break
                    //print encodingError.description
                }
            }
    }

错误日志:

VoiceStage [33099:1632858] - [ NSCFNumber dataUsingEncoding:]:无法识别的选择器发送到实例0xb000000000000013 2018-03-26 16:20:16.686009 + 0300 VoiceStage [33099:1632858] ***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFNumber dataUsingEncoding:]:无法识别的选择器发送到实例0xb000000000000013' ***第一次抛出调用堆栈: (     0 CoreFoundation 0x000000010520f12b __exceptionPreprocess + 171     1 libobjc.A.dylib 0x00000001048a3f41 objc_exception_throw + 48     2 CoreFoundation 0x0000000105290024 - [NSObject(NSObject)doesNotRecognizeSelector:] + 132     3 CoreFoundation 0x0000000105191f78 ___ forwarding _ + 1432     4 CoreFoundation 0x0000000105191958 _CF_forwarding_prep_0 + 120     5 VoiceStage 0x0000000103d09a7a T010VoiceStage27ProfileDetailViewControllerC18profilePhotoUploadyyFy9Alamofire17MultipartFormDataCcfU + 1354     6 VoiceStage 0x0000000103d0f9a4 _T010VoiceStage27ProfileDetailViewControllerC18profilePhotoUploadyyFy9Alamofire17MultipartFormDataCcfU_TA + 84     7 Alamofire 0x000000010415a994 _T09Alamofire14SessionManagerC6uploadyyAA17MultipartFormDataCc09multipartfG0_s6UInt64V14usingThresholdAA21URLRequestConvertible_p4withyAC0efG14EncodingResultOcSg18encodingCompletiontFyycfU_ + 212     8 Alamofire 0x000000010415e2bc _T09Alamofire14SessionManagerC6uploadyyAA17MultipartFormDataCc09multipartfG0_s6UInt64V14usingThresholdAA21URLRequestConvertible_p4withyAC0efG14EncodingResultOcSg18encodingCompletiontFyycfU_TA + 156     9 Alamofire 0x00000001040e0599 _T0Ix_IyB_TR + 41     10 libdispatch.dylib 0x000000010a10d2f7 _dispatch_call_block_and_release + 12     11 libdispatch.dylib 0x000000010a10e33d _dispatch_client_callout + 8     12 libdispatch.dylib 0x000000010a11a3a2 _dispatch_root_queue_drain + 1444     13 libdispatch.dylib 0x000000010a119da0 _dispatch_worker_thread3 + 132     14 libsystem_pthread.dylib 0x000000010a5d41ca _pthread_wqthread + 1387     15 libsystem_pthread.dylib 0x000000010a5d3c4d start_wqthread + 13 ) libc ++ abi.dylib:以NSException类型的未捕获异常终止 (lldb)

2 个答案:

答案 0 :(得分:2)

-[NSCFNumber dataUsingEncoding:]: unrecognized selector sent to instance

错误消息说:我试图调用方法dataUsingEncoding:(Objective-C版本1),即data(using:)对象上的Swift NSNumber。我不能,我坠毁了。 所以这意味着在某些时候你认为你正在使用String对象,而实际上它是Number对象(或从Number转换为Int)。

multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)

您认为value会回复data(using:)。 事实上,它应该更多(value as String)。 管理更多案例将是测试value的类。如果它是一个String对象,请使用data(using:),如果它已经是Data对象,只需放置value

在伪代码中:

let valueToSet;
if value is a String Object {
   valueToSet = (value as String).data(using:.utf8)
} else if value is a Data Object {
   valueToSet = value
} else if value is a Number Object {
   valueToSet = String(initWithNumber:value).data(using:.utf8)
} else ... ?

    multipartFormData.append(valueToSet, withName: key)

你也写道:

let parameters: Parameters = [
    "userID": userID,
    "acToken": acToken ?? ""
]

所以关于错误的所有这些解释: userID不是字符串,或acToken不是字符串而是Int。根据名称,我倾向于说userIDInt

答案 1 :(得分:0)

在我的情况下,参数是不同的类型,我将其自定义为字符串 `let param = [                 “ user_id”:“(UserDefaults.standard.object(forKey:” id“)!)”,                 “名称”:名称,                 “ birth_date”:birthDate,                 “ stage”:“(ageStageId)”,                 “ type”:“(genderId)”,             ]为[String:任何]         打印(参数)         Alamofire.upload(multipartFormData:             {                 (multipartFormData)在                 如果image.jpegData(compressionQuality:0.1)!= nil {                     multipartFormData.append(image.jpegData(compressionQuality:0.1)!, withName:“ img”,fileName:“ file.jpeg”,mimeType:“ image / jpeg”)                 }

            for (key, value) in param
            {
                multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
            }
            print(param)
    }, to:url,headers:nil)
    { (result) in
        switch result {
        case .success(let upload,_,_ ):
            upload.uploadProgress(closure: { (progress) in

                print("//success connection and uploaded image")
            })
            upload.responseJSON
                { response in
                    if response.result.isSuccess{


                    }
            }

        case .failure( _):


            break
        }
    }` i hope this help some one