gpt4 book ai didi

ios - dispatch_async 中的完成处理程序错误 - 可选展开

转载 作者:行者123 更新时间:2023-11-29 01:33:43 25 4
gpt4 key购买 nike

我学习了一个使用 Dribbble API 实现获取数据的教程。
我卡在了完成处理程序错误上。
我确认 shots 的元素正确地作为 NSDictionary 类型。
这是并发队列的竞争条件引起的吗?
先感谢您。

DribbbleAPI.swift

//
// DribbbleAPI.swift
// iShots
//
// Created by Seo Yoochan on 10/15/15.
// Copyright © 2015 yoochan. All rights reserved.
//

import Foundation


class DribbbleAPI {
let accessToken = "6d23de112fd5859e7d5658e6b41eee5f1e76291e3327882017457352c56e61a9"

func loadShots(completion: ((AnyObject) -> Void)!) {
let url = "https://api.dribbble.com/v1/shots?access_token=" + accessToken

let session = NSURLSession.sharedSession()
let shotsURL = NSURL(string: url)

let task = session.dataTaskWithURL(shotsURL!) {
(data, resposne, error) -> Void in

if error != nil {
print(error!.localizedDescription)
} else {

do {

let shotsData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)


var shots = [Shot]()

for shot in shotsData as! NSArray {
let shot = Shot(data: shot as! NSDictionary)
shots.append(shot)

}

if shots.count > 0 {
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)){

dispatch_async(dispatch_get_main_queue()){
completion(shots) // error here
}
}
}




} catch {
}
}
}

task.resume()


}


}

快速射击

//
// Shot.swift
// iShots
//
// Created by Seo Yoochan on 10/15/15.
// Copyright © 2015 yoochan. All rights reserved.
//

import Foundation

class Shot {
var id: Int!
var title: String!
var description: String!
var commentCount: Int!
var likesCount: Int!
var viewsCount: Int!
var commentUrl: String!
var imageUrl: String!
var imageData: NSData?

init(data: NSDictionary){
self.id = data["id"] as! Int
self.commentCount = data["comments_count"] as! Int
self.likesCount = data["likes_count"] as! Int
self.viewsCount = data["views_count"] as! Int
self.commentUrl = getStringFromJSON(data, key: "comments_url")
self.title = getStringFromJSON(data, key: "title")
self.description = getStringFromJSON(data, key: "description")
let images = data["images"] as! NSDictionary
self.imageUrl = getStringFromJSON(images, key: "normal")


}

func getStringFromJSON(data: NSDictionary, key: String) -> String {

if let info = data[key] as? String {
return info
}

return ""
}
}

ViewController.swift

//
// ViewController.swift
// iShots
//
// Created by Seo Yoochan on 10/15/15.
// Copyright © 2015 yoochan. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let api = DribbbleAPI()
api.loadShots(nil)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}


}

错误日志

fatal error: unexpectedly found nil while unwrapping an Optional value

最佳答案

您通过 api.loadShots(nil) 调用您的方法,稍后在该方法中您编写 completion(shots),如果 这当然不起作用completion 定义为 ((AnyObject) -> Void)!nil

您可能想将该代码更改为

func loadShots(completion: ((AnyObject) -> Void)?) {
...
if let callback = completion {
callback(shots)
}
...
}

甚至更短一点

completion?(shots)

或者,如果您希望编码器始终必须提供如下所示的回调,则也可以一起删除可选的。请注意,在这种情况下,编译器将不允许传递 nil。

 func loadShots(completion: ((AnyObject) -> Void)) {
...
completion(shots)
...
}

你目前在你的代码中使用的是一个隐式解包的可选值,这基本上意味着它可以不时地保持 nil 但如果它需要解包它会自动这样做,只有当值不是 nil 时它才会起作用。使用隐式解包选项会导致开发人员(您)必须更加小心,否则会发生类似崩溃的情况。

您可能想要 read up on optionals再次。

关于ios - dispatch_async 中的完成处理程序错误 - 可选展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33187587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com