如何传递给循环调用的URLSession.shared.dataTask?
How to pass to URLSession.shared.dataTask called in a loop?
我正在从服务器下载图像,当下载图像时,我必须将该图像保存在带有 id 的 coredata 中。这是代码
for actionDict:JSON in actionData
{
if(actionDict["ProtocolImage"].stringValue.isValidURL())
{
URLSession.shared.sessionDescription = "\(actionDict["Id"].intValue)"
URLSession.shared.dataTask(with: URL(string: actionDict["ProtocolImage"].stringValue)!, completionHandler: { (data, response, error) in
if data != nil{
let image = UIImage(data: data!)
if image != nil{
ProtocolActionModel.updateValueWhere(id: Int64(URLSession.shared.sessionDescription!)!, key: "protocolImage", value:( UIImagePNGRepresentation(image!)! as NSData))
}
}
}).resume()
}
}
(actionDict["Id"].intValue
是与图像相关联的 id,我想将其与图像一起保存在 coredata 中,但是当我保存它时,它总是设置为 for 循环的最后一个项目 id。
actionData
是
{
data = (
{
CheckDesc = vcnhfgb;
CheckName = hjnhfnmjh;
CheckedImage = (
);
CreatedDate = "/Date(1487201399293)/";
Id = 3;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/522cb086-0b0d-4ad9-b5ae-79f6f9a9fbf2.jpg";
Sorting = "<null>";
},
{
CheckDesc = bfghrthbn;
CheckName = ddfgb;
CheckedImage = (
);
CreatedDate = "/Date(1499167861457)/";
Id = 71;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/860e68e4-187c-4e49-a936-088c97c500b2.png";
Sorting = 41;
},
{
CheckDesc = bnvbncyh;
CheckName = nbnyhjhg;
CheckedImage = (
);
CreatedDate = "/Date(1499167894280)/";
Id = 72;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/e4311494-27ad-4d12-958b-68e0c705a94d.png";
Sorting = 42;
},
{
CheckDesc = hjbnvbytuu;
CheckName = nmnmhjgh;
CheckedImage = (
);
CreatedDate = "/Date(1499167918147)/";
Id = 73;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/15ac0300-8877-4503-8c6d-957b5248e829.png";
Sorting = 43;
},
{
CheckDesc = "";
CheckName = tyres;
CheckedImage = (
);
CreatedDate = "/Date(1499172466890)/";
Id = 74;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "<null>";
Sorting = 44;
}
);
message = success;
status = 1;
}
回应
<NSHTTPURLResponse: 0x600000634720> { URL: http://example/ApplicationImages/860e68e4-187c-4e49-a936-088c97c500b2.png } { status code: 200, headers {
"Accept-Ranges" = bytes;
"Content-Length" = 254882;
"Content-Type" = "image/png";
Date = "Wed, 05 Jul 2017 05:31:46 GMT";
Etag = "\"e09aa43b9f4d21:0\"";
"Last-Modified" = "Tue, 04 Jul 2017 11:31:01 GMT";
Server = "Microsoft-IIS/7.5";
"X-Powered-By" = "ASP.NET";
"X-Powered-By-Plesk" = PleskWin;
} }
请提供可以解决我的问题的任何解决方案。
我没有整理这个希望你能明白。假设 URL 对 ID 是唯一的,您可以将其作为密钥保存并在完成处理程序中访问它。
//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
var keyDictionary = [String: Int]()
for actionDict:JSON in actionData
{
if(actionDict["ProtocolImage"].stringValue.isValidURL())
{
keyDictionary[actionDict["ProtocolImage"].stringValue] = actionDict["Id"].intValue
URLSession.shared.dataTask(with: URL(string: actionDict["ProtocolImage"].stringValue)!, completionHandler: { (data, response, error) in
if data != nil{
let image = UIImage(data: data!)
if image != nil{
realValue = keyDictionary[response.URL];
ProtocolActionModel.updateValueWhere(id: Int64(realvalue!)!, key: "protocolImage", value:( UIImagePNGRepresentation(image!)! as NSData))
}
}
}).resume()
}
}
我使用 NSData(contentsOf: url as URL)
而不是 URLSession.shared.dataTask
从 URL 下载图像。
例如:
我只是用静态数据将其替换为动态数据
var resultArray = [Dictionary<String,Any>]()
var resultDict1 = Dictionary<String,Any>()
resultDict1["Id"] = 3
resultDict1["ProtocolImage"] = "https://alperkayabasi.files.wordpress.com/2014/10/asd.png"
var resultDict2 = Dictionary<String,Any>()
resultDict2["Id"] = 7
resultDict2["ProtocolImage"] = "https://alperkayabasi.files.wordpress.com/2014/10/ios-simulator-screen-shot-08-oct-2014-16-39-03.png"
var resultDict3 = Dictionary<String,Any>()
resultDict3["Id"] = 9
resultDict3["ProtocolImage"] = "https://alperkayabasi.files.wordpress.com/2015/02/screen-shot-2015-02-13-at-10-18-12.png"
resultArray.append(contentsOf: [resultDict1,resultDict2,resultDict3])
for actionDict in resultArray {
//here check your URL is valid one
if let url = URL(string: (actionDict["ProtocolImage"] as? String ?? "".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed))!) {
DispatchQueue.global(qos: .background).async {
// Background Thread
let imageData = NSData(contentsOf: url as URL)
if let data = imageData {
if let image = UIImage(data: data as Data) {
print(actionDict["Id"] as? Int ?? 0)
print(actionDict["ProtocolImage"] as? String ?? "")
//here itself you can able to save image to coredata
DispatchQueue.main.async {
//update UI part if requires
}
}
}
}
}
}
输出:
在这里您将获得正确的图片 ID。
7
https://alperkayabasi.files.wordpress.com/2014/10/ios-simulator-screen-shot-08-oct-2014-16-39-03.png
9
https://alperkayabasi.files.wordpress.com/2015/02/screen-shot-2015-02-13-at-10-18-12.png
3
https://alperkayabasi.files.wordpress.com/2014/10/asd.png
我正在从服务器下载图像,当下载图像时,我必须将该图像保存在带有 id 的 coredata 中。这是代码
for actionDict:JSON in actionData
{
if(actionDict["ProtocolImage"].stringValue.isValidURL())
{
URLSession.shared.sessionDescription = "\(actionDict["Id"].intValue)"
URLSession.shared.dataTask(with: URL(string: actionDict["ProtocolImage"].stringValue)!, completionHandler: { (data, response, error) in
if data != nil{
let image = UIImage(data: data!)
if image != nil{
ProtocolActionModel.updateValueWhere(id: Int64(URLSession.shared.sessionDescription!)!, key: "protocolImage", value:( UIImagePNGRepresentation(image!)! as NSData))
}
}
}).resume()
}
}
(actionDict["Id"].intValue
是与图像相关联的 id,我想将其与图像一起保存在 coredata 中,但是当我保存它时,它总是设置为 for 循环的最后一个项目 id。
actionData
是
{
data = (
{
CheckDesc = vcnhfgb;
CheckName = hjnhfnmjh;
CheckedImage = (
);
CreatedDate = "/Date(1487201399293)/";
Id = 3;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/522cb086-0b0d-4ad9-b5ae-79f6f9a9fbf2.jpg";
Sorting = "<null>";
},
{
CheckDesc = bfghrthbn;
CheckName = ddfgb;
CheckedImage = (
);
CreatedDate = "/Date(1499167861457)/";
Id = 71;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/860e68e4-187c-4e49-a936-088c97c500b2.png";
Sorting = 41;
},
{
CheckDesc = bnvbncyh;
CheckName = nbnyhjhg;
CheckedImage = (
);
CreatedDate = "/Date(1499167894280)/";
Id = 72;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/e4311494-27ad-4d12-958b-68e0c705a94d.png";
Sorting = 42;
},
{
CheckDesc = hjbnvbytuu;
CheckName = nmnmhjgh;
CheckedImage = (
);
CreatedDate = "/Date(1499167918147)/";
Id = 73;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "http://example.com/ApplicationImages/15ac0300-8877-4503-8c6d-957b5248e829.png";
Sorting = 43;
},
{
CheckDesc = "";
CheckName = tyres;
CheckedImage = (
);
CreatedDate = "/Date(1499172466890)/";
Id = 74;
IsChecked = 0;
ProtocolId = 4;
ProtocolImage = "<null>";
Sorting = 44;
}
);
message = success;
status = 1;
}
回应
<NSHTTPURLResponse: 0x600000634720> { URL: http://example/ApplicationImages/860e68e4-187c-4e49-a936-088c97c500b2.png } { status code: 200, headers {
"Accept-Ranges" = bytes;
"Content-Length" = 254882;
"Content-Type" = "image/png";
Date = "Wed, 05 Jul 2017 05:31:46 GMT";
Etag = "\"e09aa43b9f4d21:0\"";
"Last-Modified" = "Tue, 04 Jul 2017 11:31:01 GMT";
Server = "Microsoft-IIS/7.5";
"X-Powered-By" = "ASP.NET";
"X-Powered-By-Plesk" = PleskWin;
} }
请提供可以解决我的问题的任何解决方案。
我没有整理这个希望你能明白。假设 URL 对 ID 是唯一的,您可以将其作为密钥保存并在完成处理程序中访问它。
//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
var keyDictionary = [String: Int]()
for actionDict:JSON in actionData
{
if(actionDict["ProtocolImage"].stringValue.isValidURL())
{
keyDictionary[actionDict["ProtocolImage"].stringValue] = actionDict["Id"].intValue
URLSession.shared.dataTask(with: URL(string: actionDict["ProtocolImage"].stringValue)!, completionHandler: { (data, response, error) in
if data != nil{
let image = UIImage(data: data!)
if image != nil{
realValue = keyDictionary[response.URL];
ProtocolActionModel.updateValueWhere(id: Int64(realvalue!)!, key: "protocolImage", value:( UIImagePNGRepresentation(image!)! as NSData))
}
}
}).resume()
}
}
我使用 NSData(contentsOf: url as URL)
而不是 URLSession.shared.dataTask
从 URL 下载图像。
例如:
我只是用静态数据将其替换为动态数据
var resultArray = [Dictionary<String,Any>]()
var resultDict1 = Dictionary<String,Any>()
resultDict1["Id"] = 3
resultDict1["ProtocolImage"] = "https://alperkayabasi.files.wordpress.com/2014/10/asd.png"
var resultDict2 = Dictionary<String,Any>()
resultDict2["Id"] = 7
resultDict2["ProtocolImage"] = "https://alperkayabasi.files.wordpress.com/2014/10/ios-simulator-screen-shot-08-oct-2014-16-39-03.png"
var resultDict3 = Dictionary<String,Any>()
resultDict3["Id"] = 9
resultDict3["ProtocolImage"] = "https://alperkayabasi.files.wordpress.com/2015/02/screen-shot-2015-02-13-at-10-18-12.png"
resultArray.append(contentsOf: [resultDict1,resultDict2,resultDict3])
for actionDict in resultArray {
//here check your URL is valid one
if let url = URL(string: (actionDict["ProtocolImage"] as? String ?? "".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed))!) {
DispatchQueue.global(qos: .background).async {
// Background Thread
let imageData = NSData(contentsOf: url as URL)
if let data = imageData {
if let image = UIImage(data: data as Data) {
print(actionDict["Id"] as? Int ?? 0)
print(actionDict["ProtocolImage"] as? String ?? "")
//here itself you can able to save image to coredata
DispatchQueue.main.async {
//update UI part if requires
}
}
}
}
}
}
输出:
在这里您将获得正确的图片 ID。
7
https://alperkayabasi.files.wordpress.com/2014/10/ios-simulator-screen-shot-08-oct-2014-16-39-03.png
9
https://alperkayabasi.files.wordpress.com/2015/02/screen-shot-2015-02-13-at-10-18-12.png
3
https://alperkayabasi.files.wordpress.com/2014/10/asd.png