- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个用于将图像上传到我的服务器的进度指示器!我的目标是让包含 UIProgressView
和 UILabel
的 UIView
显示正在上传的照片的当前状态。
每次我的代码向我的服务器发送图像时,它应该循环到下一张图片,同时更新 UILabel
(引用 lblImagesRemaining
)和 UIProgressView
(引用 progressImages
)。
我能够让 UIView
(给定引用 viewUploadBox
)出现并稍微更新进度,但我似乎无法将其发送给 完全工作。 viewUploadBox
将出现,但 lblImagesRemaining
和 progressImages
都不会更新,直到上传过程完成约 70%。不过,一旦它确实达到了 ~70% 的完成度,它就会在每次发送图像时进行更新。
这是触发 Upload Test
按钮之前我的 UIViewController
:
这是我的 UIViewController
一旦首次触发 Upload Test
按钮:
上传过程完成约 70% 后,这是我的 UIViewController
:
这是我的代码:
@IBAction func uploadTest(_ sender: Any) {
let imageCount = collectImages() // Collect images also prepares the tests with dictionaries for images to upload.
DispatchQueue.main.async {
self.viewUploadBox.isHidden = false
self.lblImagesRemaining.text = "Images Remaining: " + String(imageCount)
self.view.alpha = 0.5
self.viewUploadBox.alpha = 1.5
}
let time = DispatchTime.now() + 0.01
DispatchQueue.main.asyncAfter(deadline: time) { // The asyncAfter was used to ensure that the viewUploadBox appeared.
self.uploadTest(imageCount: imageCount)
}
}
func uploadTest(imageCount: Int) {
let progressFactor = 1.0 / Double(imageCount)
var i = 1
var imagesRemaining = imageCount
while i < 8 {
let imageDictionary = projectHandler.testHandler.getImageDictionary(i)
let test = imageDictionary["test"] as! String
for (key, value) in imageDictionary {
if key == "test" || key == "count" {
continue
}
let url = NSURL(string: "http://IMAGEUPLOADLOCATION.PHP")
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST"
let boundary = generateBoundaryString()
//define the multipart request type
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let image_data = UIImageJPEGRepresentation((value as! UIImage), 0.2)
let body = NSMutableData()
let constructedName = userdata.valueForKey("name_full") + "(ID-" + userdata.valueForKey("id_ACCOUNT") + ")"
let parameters = [
"name" : constructedName,
"project" : projectHandler.projectName,
"picturefile" : key + ".jpeg",
"testname" : test,
"projectid" : projectHandler.idPROJECT,
"accountid" : userdata.valueForKey("id_ACCOUNT"),
"brazerid" : projectHandler.idBrazer]
//define the data post parameter
for (key, value) in parameters {
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
}
let fname = "image"
let mimetype = "image/jpeg"
body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Disposition:form-data; name=\"file\"; filename=\"\(fname); \"\r\n".data(using: String.Encoding.utf8)!)
body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
body.append(image_data!)
body.append("\r\n".data(using: String.Encoding.utf8)!)
body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
request.httpBody = body as Data
let session = URLSession.shared
session.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
if(error != nil){
print("error")
} else {
do {
let dataString = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String : AnyObject]
print("Response: \(response!)")
print("Data: \(data!)")
print(dataString)
} catch {
print(error)
}
}
DispatchQueue.main.async {
self.progressImages.progress += Float(progressFactor)
imagesRemaining -= 1
self.lblImagesRemaining.text = "Images Remaining: " + String(imagesRemaining)
if imagesRemaining == 0 {
self.viewUploadBox.isHidden = true
self.btnEmail.isEnabled = true
self.view.alpha = 1.0
}
}
}).resume()
}
i += 1
}
}
最佳答案
这似乎是一个竞争条件。尝试下一个片段。
import PlaygroundSupport
import Dispatch
PlaygroundPage.current.needsIndefiniteExecution = true
let q = DispatchQueue(label: "test") // serial queue
var j = 0
DispatchQueue.concurrentPerform(iterations: 10) { i in
q.async {
j += 1
DispatchQueue.main.async {
print(i, j)
}
}
}
print("total",j)
检查代码,试着想象代码将打印出什么,并将结果与您的预期进行比较:-)
它打印
total 6
0 10
1 10
2 10
3 10
4 10
5 10
6 10
7 10
8 10
9 10
这是你期望的吗?
让我们尝试一些更高级的东西:-)
import PlaygroundSupport
import Dispatch
PlaygroundPage.current.needsIndefiniteExecution = true
let q = DispatchQueue(label: "test") // serial queue
class S {
let q = DispatchQueue(label: "sync", attributes: .concurrent)
private var v: Int = 0
func add(i: Int) {
q.async(flags: .barrier) {
self.v += i
}
}
var i: Int {
get {
return q.sync {
return v
}
}
}
}
let s = S()
DispatchQueue.concurrentPerform(iterations: 10) { i in
q.async {
s.add(i: 1)
let k = s.i
DispatchQueue.main.async {
print(i, s.i, k)
}
}
}
看起来好多了,但再次检查结果。
0 4 1
1 4 2
2 4 3
3 4 4
4 6 5
5 6 6
6 8 7
7 8 8
8 10 9
9 10 10
查看第二和第三“列”中的值之间的差异。第二个看起来像你的进度条,第三个是你想要的。
嗯,但是我们使用从并发调度的串行队列...让我们删除它
import Dispatch
PlaygroundPage.current.needsIndefiniteExecution = true
class S {
let q = DispatchQueue(label: "sync", attributes: .concurrent)
private var v: Int = 0
func add(i: Int) {
q.async(flags: .barrier) {
self.v += i
}
}
var i: Int {
get {
return q.sync {
return v
}
}
}
}
let s = S()
DispatchQueue.concurrentPerform(iterations: 10) { i in
s.add(i: 1)
let k = s.i
DispatchQueue.main.async {
print(i, s.i, k)
}
}
我们又回到了起点......
1 10 4
0 10 4
3 10 4
2 10 5
5 10 7
4 10 7
6 10 7
7 10 10
8 10 10
9 10 10
解决方案
import PlaygroundSupport
import Dispatch
PlaygroundPage.current.needsIndefiniteExecution = true
class S {
let q = DispatchQueue(label: "sync", attributes: .concurrent)
private var v: Int = 0
func add(i: Int) {
q.async(flags: .barrier) {
self.v += i
let k = self.v
DispatchQueue.main.async {
print("update progress", k)
}
}
}
var i: Int {
get {
return q.sync {
return v
}
}
}
}
let s = S()
DispatchQueue.concurrentPerform(iterations: 10) { i in
s.add(i: 1)
print(i, s.i)
}
打印
0 3
1 5
2 5
3 5
4 7
5 9
8 9
7 9
6 9
9 10
update progress 1
update progress 2
update progress 3
update progress 4
update progress 5
update progress 6
update progress 7
update progress 8
update progress 9
update progress 10
无法保证并发任务的完成顺序,但会正确指示我们的进度。
关于ios - swift 3 : DispatchQueue Timing over URLSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43507202/
共享 URLSession 和默认配置的 URLSession 有什么区别? 在我的应用程序中,我使用 URLSession.shared 向服务器发送请求。现在我尝试将其更改为 URLSession
我有一个URLSessionDataDelegate来将图片上传到服务器,以下是其中的一部分。 当我选择要上传的图像时,URLSession 会立即初始化。 但是,如果用户点击上传按钮并且没有互联网连
Swift 5 引入了新的 Result 类型来处理异步函数的结果。我想知道如何将这种新的结果类型用于 URLSession。 I have this following code. func get
在后台 session 中,对于使用 https 的应用<>服务器通信,以下方法的相当轻松的实现有什么区别,或根本没有 ? func urlSession(_ session: URLSessio
我正在尝试使用 Swift 向带有一些 JSON 数据的 php 脚本发出 POST 请求。当我运行以下代码时,我的应用程序崩溃并且没有信息记录到控制台。 if let jsonData = try?
我有一个用于对服务器进行身份验证的客户端代码(已实现服务器,以便在成功时我收到重定向网址),并且想要检查状态代码是否为 302。但是请求会自动重定向,响应结果是200。那么问题是如何防止自动重定向?
我正在对 URLSession 使用方法调配,下面是我的调配方法。我不确定为什么应用程序在执行 @escaping 的完成处理程序时在目标应用程序中崩溃。请帮助我。 @objc func mytest
使用 URLSessionDownloadTask。有没有办法使用委托(delegate) didwritedata 获取多个文件下载的总体进度?在一个 我有所有文件的预期大小,现在我需要所有当前任务
我刚刚遇到的事情完全改变了我对 iOS 中 URLSession 缓存的印象。 我们正在触及一个只被触及过一次的端点。 重新启动应用程序不会再次到达端点。 删除应用会导致它再次到达端点...但只有一次
我正在使用 URLSession 和一项名为 Backendless 的服务。 Backendless 与 Parse 非常相似。 Backendless 有一个消息服务,可以让你发送电子邮件。我在我
我已经使用适合 URLSession 完整回调签名的方法定义了自己的类,例如。 G。 (数据?、响应?、错误?)-> 无效。该方法包含用于处理响应的通用逻辑,例如。 G。检查数据,解析数据等现在我想对
我正在尝试使用一段在 Xcode playground 文件中工作的代码从本地服务器获取一些数据: URLSession.shared.dataTask(with: url!, comp
我正在使用一个实际上是为 swift 2 编写的函数。我已经为 swift 3 做了调整。但我不断收到错误: URLSession' produces '()', not the expected c
我正在尝试在我的 iOS 应用程序中与我公司的 API 进行通信。我使用的是标准 URLSession。 API 会自动负载平衡并重定向到不同的服务器,因此我实现了处理重定向的 URLSessionD
为每个网络请求创建一个新的 URLSession 是否会占用大量资源? 一些背景: 我正在开发一个用于发出网络请求的库。我正在尝试添加一项功能,允许将结果下载到一个文件中,该文件也会报告其进度。为此,
我目前正在使用基于此教程的代码 http://sweettutos.com/2015/11/06/networking-in-swift-how-to-download-a-file-with-nsu
我有一个从 viewDidLoad 触发的 URLSession。它返回包含图像 URL 的 JSON。因此,为了获得该图像,我从第一个 URLSession 的完成 block 调用的 JSON 解
尝试使用 Swift jSon 解码器解析 json 时出现类型不匹配错误。 我只是找不到正常解析它的方法。 错误: typeMismatch(Swift.String, Swift.Decoding
我正在查看一个用 Swift 4 编写的 iOS 应用程序。它有一个使用 URLSession 的相当简单的网络层,但是该应用程序没有单元测试,在我开始重构之前,我很想通过引入一些来解决这个问题测试。
我正在使用 URLSession 和 downloadTask 在前台下载文件。下载比预期慢得多。我发现的其他帖子解决了后台任务的问题。 let config = URLSessionConfigur
我是一名优秀的程序员,十分优秀!