我试图在GET请求的帮助下将服务器中的图像加载到我的iOS应用程序中。但是,它会报告错误:
对成员'jsonObject(with:options:)
的模糊引用
有人可以帮忙解决错误吗?
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet var MyCollectionView: UICollectionView!
var images : [String] = []
override func viewDidLoad() {
super.viewDidLoad()
loadImages()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return images.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
//MyCollectionViewCell
let myCell:MyCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as! MyCollectionViewCell
DispatchQueue.global(qos: .background).async{
let imageString = self.images[indexPath.row]
let imageUrl = NSURL(string: imageString)
let imageData = NSData(contentsOf: imageUrl! as URL)
DispatchQueue.main.async {
//if(imageData! = nil)
//{
myCell.myImageView.image = UIImage(data: imageData! as Data)
//}//end of if
}//end of DispatchQueue.main.async
};//end of main dispatch
return myCell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("User tapped on image # \(indexPath.row)")
}
func loadImages()
{
let startTime = NSDate.timeIntervalSinceReferenceDate
var pageUrl = "Url is here"
let myUrl = NSURL(string: pageUrl)
let request = NSMutableURLRequest(url:myUrl! as URL)
let task = URLSession.shared.dataTask(with: request as URLRequest){
data, response, error in
//If error displays any alert message
if error != nil {
var myAlert = UIAlertController(title: "Alert", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction)
self.present(myAlert, animated: true, completion: nil)
return
}
var err: NSError?
if let usabledata = data{
do{
var jsonArray = try JSONSerialization.jsonObject(with: usabledata, options: .mutableContainers) as! [String:AnyObject]
print(jsonArray)
//conditional binding error here
if let parseJSONArray = jsonArray {
self.images = parseJSONArray as! [String]
DispatchQueue.main.async(execute: {
self.MyCollectionView.reloadData()
})//end of dispatchQueue
}//end of if
}catch{
print(error)
}
}
}
task.resume()
}
}
答案 0 :(得分:2)
试试这个:
替换为您的代码
if let usableData = data {
do {
var jsonArray = try JSONSerialization.jsonObject(with: usableData, options: .mutableContainers) as! [String:AnyObject]
if let parseJSONArray = jsonArray as? [String] {
// parse array here
}
} catch {
print("JSON Processing Failed")
}
}
答案 1 :(得分:2)
尝试从NSURLSession任务的data
参数解码JSON时会发生这种情况。
data
是Data?
的可选。首先将其解包以避免错误。
nsURLSession.dataTask(with: url) { (data, response, error) in
// unwrap `data: Data?` first
guard let dictionary = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any] else {
return
}
}.resume()
答案 2 :(得分:0)
NSData返回可选的多数民众赞成,这就是为什么您需要使用Conditional Optional绑定技术将其解包的原因,然后它将起作用。
let content = NSData()
if let data = content {
do {
let json = try JSONSerialization.jsonObject(with: data as Data, options: []) as! NSDictionary
} catch let error {
print(error)
}
}