サーバーに画像をアップロードするための進捗インジケータを作成しようとしています!私の目標は、UIProgressView
とUILabel
を含むUIView
をアップロードして写真の現在の状態を表示することです。Swift 3:DispatchQueue URLSessionのタイミング
私のコードは私のサーバーに画像をオフに送信し、それが(progressImages
を参照)、次の画像へのループUILabel
を更新中(lblImagesRemaining
を参照)とUIProgressView
べきたびに。
UIView
表示され、多少の進捗状況を更新する(参照を
viewUploadBox
与えられた)が、私はそれに
完全仕事を得るように見えることはできません。
viewUploadBox
が表示されますが、
lblImagesRemaining
も
progressImages
も、アップロードプロセスが〜70%完了するまで更新されません。しかし、一度それが〜70%の完成をヒットしても、イメージが送信されるたびにアップデートされます。
Upload Test
ボタンがトリガーされる前に
Upload Test
ボタンが最初にトリガーされるとここに私のUIViewController
です:
をここでアップロードプロセスが〜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
}
}
ここには混乱するコードがたくさんあります。あなたはあなたの 'uploadTest'メソッドに' imageCount'を渡します。しかし、あなたはwhileループを7回反復するようにハードコードしています。どうして?次に、 'imageDictionary'のキーと値を繰り返すループがあります。それぞれのキー/値のペアに対して新しい 'URLSession'を開始します。どうして? – rmaddy
カスタムテストクラスである7つの 'Test'オブジェクトがあります。 'uploadTest'コードの先頭にある' collectImages'メソッドは、7つの異なる辞書を作成し、アップロードする必要がある画像の数を 'imageCount'に伝えます。 'getImageDictionairy(i)'メソッドは、7つの辞書を循環させるために使用されます。これには常に7つの辞書がありますので、whileループでハードコードされています。新しい 'URLSession'については、それはコーディングの無知にまで下がるかもしれません。複数のURLSessionを使わずに異なるキーと値のペアを持つ76の画像をアップロードするより適切な方法が分かりません –