我正在尝试使用以下代码从给定的网址下载图片(jpeg):
let manager = AFHTTPRequestOperationManager()
manager.responseSerializer = AFImageResponseSerializer()
manager.responseSerializer.acceptableContentTypes = NSSet(array: ["application/octet-stream"]) as Set<NSObject>
manager.GET(imageURL, parameters: nil,
success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in
println("IMAGE SUCCESS")
}, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in
println("IMAGE FAIL")
})
目前使用我的互联网,在模拟器上进行测试时会调用success
块。但是,在iPhone上进行测试时会调用failure
块。在另一个网络上,总是在iPhone和模拟器上调用成功块。
我无法弄清楚造成这个问题的原因。我已经尝试将Content-Type设置为“image / jpeg”但仍然得到相同的结果。我错过了什么吗?
错误是:
错误域= NSURLErrorDomain代码= -1001“请求超时。” UserInfo = 0x1675f381 {NSErrorFailingURLStringKey =&lt; ...&gt;,NSErrorFailingURLKey =&lt; ...&gt;,NSLocalizedDescription =请求超时。,NSUnderlyingError = 0x166c7891“请求超时。”}
答案 0 :(得分:0)
您是在请求许多图像(或执行许多网络请求)吗?如果是这样,您可能希望约束AFHTTPRequestOperationManager
:
manager.operationQueue.maxConcurrentOperationCount = 5
如果您不这样做然后继续发起许多请求,那么即使NSURLConnection
(AFHTTPRequestOperationManager
在幕后使用)只能排队网络请求,也会启动“超时”一次运行4或5,后面的请求甚至可能在早先的请求完成之前就开始。您希望根据请求何时开始而不是在请求入队时启动网络请求的超时逻辑。通过约束maxConcurrentOperationCount
,您可以确保在合理执行网络请求之前不会启动它们。
请注意,假设您对所有请求使用相同的AFHTTPRequestOperationManager
,而不是为新请求实例化新的操作管理器。但这将确保在其他请求的积压减少到可接受的水平之前不会启动请求。
-
顺便说一句,我只是建议对其进行补充,而不是替换acceptableContentTypes
:
var acceptableContentTypes = manager.responseSerializer.acceptableContentTypes ?? Set<NSObject>()
acceptableContentTypes.insert("application/octet-stream")
manager.responseSerializer.acceptableContentTypes = acceptableContentTypes
坦率地说,我宁愿看到您修复从服务器检索的Content-Type
图像,这样它就不会发送application/octet-stream
个响应,但如果您不能这样做,以上可能是一种更谨慎的方式来调整内容类型。这可确保您接受自定义application/octet-stream
类型以及标准图像类型。