Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios URLSession函数类似于Alamofire';什么是责任预算?_Ios_Swift_Nsurlsession - Fatal编程技术网

Ios URLSession函数类似于Alamofire';什么是责任预算?

Ios URLSession函数类似于Alamofire';什么是责任预算?,ios,swift,nsurlsession,Ios,Swift,Nsurlsession,因为我使用的是cocoapods,并且有必要的Objective-C依赖关系,所以我不能使用框架,因此也不能使用Alamofire。。。Alamofire有一个函数responseString(见下面的代码),所以我需要使用URLSession以本机方式完成这项工作,我如何才能做到这一点 Alamofire.request(testURL).responseString { response in print("\(response.result.isSuccess)")

因为我使用的是cocoapods,并且有必要的Objective-C依赖关系,所以我不能使用框架,因此也不能使用Alamofire。。。Alamofire有一个函数responseString(见下面的代码),所以我需要使用URLSession以本机方式完成这项工作,我如何才能做到这一点

 Alamofire.request(testURL).responseString { response in
        print("\(response.result.isSuccess)")
        if let html = response.result.value {
            parseHTML(html: html)
        }
    }
阿拉莫菲尔:

extension DataRequest {
    /// Creates a response serializer that returns a result string type initialized from the response data with
    /// the specified string encoding.
    ///
    /// - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the server
    ///                       response, falling back to the default HTTP default character set, ISO-8859-1.
    ///
    /// - returns: A string response serializer.
    public static func stringResponseSerializer(encoding: String.Encoding? = nil) -> DataResponseSerializer<String> {
        return DataResponseSerializer { _, response, data, error in
            return Request.serializeResponseString(encoding: encoding, response: response, data: data, error: error)
        }
    }

    /// Adds a handler to be called once the request has finished.
    ///
    /// - parameter encoding:          The string encoding. If `nil`, the string encoding will be determined from the
    ///                                server response, falling back to the default HTTP default character set,
    ///                                ISO-8859-1.
    /// - parameter completionHandler: A closure to be executed once the request has finished.
    ///
    /// - returns: The request.
    @discardableResult
    public func responseString(
        queue: DispatchQueue? = nil,
        encoding: String.Encoding? = nil,
        completionHandler: @escaping (DataResponse<String>) -> Void)
        -> Self
    {
        return response(
            queue: queue,
            responseSerializer: DataRequest.stringResponseSerializer(encoding: encoding),
            completionHandler: completionHandler
        )
    }
}
扩展数据请求{
///创建一个响应序列化程序,该序列化程序返回从具有
///指定的字符串编码。
///
///-参数编码:字符串编码。如果为“nil”,则字符串编码将由服务器确定
///响应,返回默认HTTP默认字符集ISO-8859-1。
///
///-返回:字符串响应序列化程序。
公共静态函数stringResponseSerializer(编码:String.encoding?=nil)->DataResponseSerializer{
返回DataResponseSerializer{},响应,数据,中的错误
返回请求.serializeResponseString(编码:编码,响应:响应,数据:数据,错误:错误)
}
}
///添加请求完成后要调用的处理程序。
///
///-参数编码:字符串编码。如果为“nil”,则字符串编码将根据
///服务器响应,返回默认HTTP默认字符集,
///ISO-8859-1。
///-参数completionHandler:请求完成后执行的闭包。
///
///-返回:请求。
@可丢弃结果
公共职能负责人(
队列:DispatchQueue?=nil,
编码:字符串。编码?=nil,
completionHandler:@escaping(DataResponse)->Void)
->自我
{
返回响应(
队列:队列,
responseSerializer:DataRequest.stringResponseSerializer(编码:编码),
completionHandler:completionHandler
)
}
}

从响应中获取数据,将其转换为字符串。阿拉莫菲尔在这里没什么作用

public static func serializeResponseString(
    encoding: String.Encoding?,
    response: HTTPURLResponse?,
    data: Data?,
    error: Error?)
    -> Result<String>
{
    guard error == nil else { return .failure(error!) }

    if let response = response, emptyDataStatusCodes.contains(response.statusCode) { return .success("") }

    guard let validData = data else {
        return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))
    }

    var convertedEncoding = encoding

    if let encodingName = response?.textEncodingName as CFString!, convertedEncoding == nil {
        convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(
            CFStringConvertIANACharSetNameToEncoding(encodingName))
        )
    }

    let actualEncoding = convertedEncoding ?? String.Encoding.isoLatin1

    if let string = String(data: validData, encoding: actualEncoding) {
        return .success(string)
    } else {
        return .failure(AFError.responseSerializationFailed(reason: .stringSerializationFailed(encoding: actualEncoding)))
    }
}
公共静态函数序列化responseString(
编码:字符串。编码?,
响应:HTTPURLResponse?,
数据:数据?,
错误:错误?)
->结果
{
guard error==nil else{return.failure(error!)}
如果let response=response,则emptyDataStatusCodes.contains(response.statusCode){return.success(“”)}
guard let validData=数据其他{
return.failure(AFError.responseSerialization失败(原因:.inputDataNil))
}
var convertedEncoding=编码
如果让encodingName=response?.textEncodingName为CFString!,则convertedEncoding==nil{
convertedEncoding=String.Encoding(原始值:CFStringConvertEncodingTonsStringCodeing(
CFSTRINGCONVERTIANACHARSETNAME编码(编码名称))
)
}
让actualEncoding=convertedEncoding??String.Encoding.isoLatin1
如果let string=string(数据:validData,编码:actualEncoding){
return.success(字符串)
}否则{
return.failure(AFError.responseSerializationFailed(原因:.stringSerializationFailed(编码:actualEncoding)))
}
}

URLSessionDataTask
获取
成功
value/html
值的基本代码是

dataTask(url: url) { (data, response, error) in

   guard error == nil else { 
      print(error!)
      // handle error
      return 
   }

   let success : Bool
   let html : String

   if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
      success = true
      html = String(data:data!, encoding: .utf8)! // or .isoLatin1
   } else {
      success = false
      print("http response error")
      html = ""
   }

   print(html, success)
}

它采用标准文本编码(utf8)。而
URLRequest
仅用于
POST
请求。

此代码到底在做什么?只需执行对testURL的请求,然后从响应中获取html数据部分?能否更明确地说明不能使用Alamofire的原因?我在cocoapods和objc依赖项中使用过它。在与cocoapods的混合项目中使用Alamofire从来没有遇到过问题(事实上,Alamofire本身就是一个pod)。没有问题,使用框架会破坏我现有的pod(即Pinterest SDK)我已经在Alamofirethanks中添加了方法中的文档,但是它在
html=String(数据:data!,编码:.utf8)上崩溃了确定此行正确吗?(我知道url是可以的…)代码未经测试,但它应该可以工作。数据是否为utf8
?当你打印数据时,你得到了预期的字节数吗?如果代码在这一行崩溃,编码不匹配。我想就是这样,我的请求是谷歌我应该使用什么编码?我更新了答案,以提供windows/latin作为替代。您可以从响应的标题(
内容类型
)获取编码。