- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这种形式的代码:
func myFunction(<...>, completionHandler: (ResponseType) -> Void) {
<prepare parameters>
mySessionManager.upload(multipartFormData: someClosure,
to: saveUrl, method: .post, headers: headers) { encodingResult in
// encodingCompletion
switch encodingResult {
case .failure(let err):
completionHandler(.error(err))
case .success(let request, _, _):
request.response(queue: self.asyncQueue) { response in
// upload completion
<extract result>
completionHandler(.success(result))
}
}
}
}
并测试这样的代码:
func testMyFunction() {
<prepare parameters>
var error: Error? = nil
var result: MyResultType? = nil
let sem = DispatchSemaphore(value: 0)
var ran = false
myFunction(<...>) { response in
if ran {
error = "ran twice"
return
}
defer {
ran = true
sem.signal()
}
switch response {
case .error(let err): error = err
case .success(let res): result = res
}
}
sem.wait()
XCTAssertNil(error, "Did not want to see this error: \(error!)")
<test response>
}
我使用信号量来阻塞主线程,直到异步处理请求;这对于我所有其他 Alamofire 请求都适用,但不适用于这个。测试挂起。
(注意:使用 active waiting 不会改变任何事情。)
使用调试器,我发现
encodingCompletion
is never called .现在我最好的猜测是 DispatchQueue.main.async
说,“当有时间时在主线程上执行这个”——它永远不会,因为我的测试代码在那里阻塞(无论如何,都会进行进一步的测试)。
我将其替换为 self.queue.async 和 upload.delegate.queue.addOperation,这是同一函数中的另外两个排队操作。然后测试运行通过但产生意外错误;我的猜测是,encodingCompletion
被调用太早。
这里有几个问题要问;任何问题的答案都可以解决我的问题。
DispatchQueue.main
可以执行其他任务吗?最佳答案
如上所述here ,这是一个糟糕的“解决方案”,因为它在嵌套请求时引入了死锁的可能性。我将其留在这里用于教学目的。
<小时/>改变
DispatchQueue.main.async {
let encodingResult = MultipartFormDataEncodingResult.success(
request: upload,
streamingFromDisk: true,
streamFileURL: fileURL
)
encodingCompletion?(encodingResult)
}
self.queue.sync {
...
}
解决(阅读:解决)问题。
我不知道这是否是一个可靠的修复或其他什么;我有filed an issue .
关于swift - 当主线程等待运行时,Alamofire 从不调用 encodingCompletion 来使用 MultipartFormData 进行上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42644111/
我有一个休息端点: @Consumes(MediaType.MULTIPART_FORM_DATA) @Path("/{test}/test") @POST public Response add(@
我在使用 Alamofire.upload multipartFormData 上传文件时遇到一些问题。我需要将多个文件上传到一个请求名称中。 例如我使用: var filesURLs = [file
我有一个接受 IFormFile 的 Controller 和一个使用表单数据的对象(一个名为 Document 的类)。 这是 Controller : [HttpPost] public asyn
我所做的只是: func postMultipart(_ url: URL, parameters: [String: Any]?, headers: [String: String]?, i
我正在尝试发送帖子请求。 这是我的尝试: -(void)Test{ NSDictionary * orderMasterDict = @{@"distributorId":@10000,
我正在尝试使用 Alamofire 上传图像,但服务器未获取图像。这是我上传的代码: Alamofire.upload(Router.UpdateUserAvatar, multipa
试图弄清楚这一点时遇到了困难。使用 Alamofire (4.4.0) 发布请求,我的 header 在大多数情况下都可以正常工作,但是这次我需要发送字符串字典和视频。 视频是通过 UIImagePi
我一直在尝试使用 Alamofire 实现多部分表单数据。我编写了一些代码,它非常适合执行时间低于 60 秒的请求。但是,如果请求花费的时间超过这个时间,它就会结束并且上传不会完成: 另外,我得到了这
如何使用 Alamofire 上传带有身份验证的 MultipartFormData?我不明白的部分是放在哪里 .authenticate(user: username, password: pass
我想用Alamo fire multipart form数据使用请求,比如我用upload API let profile = self.photoView.imageView?.image
我目前正在为 Play Framework 2.2.x 应用程序编写一些 Specs2 测试,该应用程序接受 MultipartFormData 提交作为其功能的一部分。 我已经使用以下形式成功地编写
我目前在上传带有参数和标题的图像时卡在我的学校项目中。问题是我不知道如何将 Bools 添加到 multipartFormData。有人知道吗? multipartFormData.appendBod
upload(.POST, isEdit == true ? mainURL+URLS.UpdateLicense.rawValue : mainURL+URLS.AddLicense.rawValu
我似乎在使用 Alamofire 上传图片和传递参数方面遇到了问题。我有一个非常简单的多部分数据函数,如下所示: sessionManager.upload(multipartFormData: {
我有以下代码。我想知道文件上传何时发生。我有一个像 200MB 这样的大文件。当第二行执行时它会在模型中吗? play.mvc.Http.MultipartFormData body = requ
我当前正在尝试使用 WSClient 使用以下代码将文件发布到端点 public Result uploadBankingFile(){ logger.info("Uploading file
Alamofire 4.0 的上传功能如何添加认证头? 下面是示例代码,但是我看不到向函数添加 header 的方法。 Alamofire.upload( multipartFormData:
我有这种形式的代码: func myFunction(, completionHandler: (ResponseType) -> Void) { mySessionManager.
我有一个使用以下方法的 Windows WEB API: public async Task SaveContract([FromBody] ModelDTO model) { string cu
这个问题已经有答案了: Alamofire 4 upload with parameters (2 个答案) 已关闭 4 年前。 目前我使用: func post(_ url: URL, parame
我是一名优秀的程序员,十分优秀!