- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我学习了一个使用 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/
我如何在 dispatch_async 中正确调用 dispatch_async 调用 dispatch_group_t downloadQueue = dispatch_group_create()
我想按顺序添加一个 dispatch_async,但我不希望它们随机启动。我想举个例子: dispatch_async 1 开始... dispatch_async 1 结束。 dispatch_as
我正在尝试从 Firebase 下载一些带有图像的帖子并将其显示在我的表格 View 中。在下面的代码中,我注意到 tableview 仅在从 preLoadImage 函数调用下载每个图像后才加载。
我正在尝试学习 GCD,所以我还没有完全掌握它的工作原理。出于某种原因,我在调用以下方法后遇到帧率永久下降的情况。如果我不使用调度函数而只是在主循环中写入数据,帧速率将保持在 60。我不知道为什么。
我在将 JSON 数据存储到单个对象数组中时遇到问题。看起来问题出在处理 JSON 请求的 dispatch_asynch 的执行中。当我在方法之前创建一个断点而不是单步执行应用程序时,它似乎只是通过
我知道 dispatch_async 可以处理线程。 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
我有一个使用dispatch_async的函数: - (IBAction)action:(id)sender { int i=10000; NSString * data; d
我猜不到它的输出。 dispatch_async(serial_queue,^{NSlog(@"1");}); NSlog(@"2"); dispatch_async(serial_queue,^{N
NSString *firstID = @"https://wallpaperbrowse.com/media/images/soap-bubble-1958650_960_720.jpg"; 想象一
dispatch_queue_t queue = dispatch_queue_create("setup_cell", NULL); dispatch_async(queue, ^{ //L
我正在使用 here 的解决方案使 titleView clipsToBounds 始终为真。 我的 ViewController 中有这个并且运行良好,但是,如果我通过按后退按钮离开 ViewCon
我正在开发一个应用程序,我必须在其中从 JSON 获取数据并在 UITableView 中显示。正在后台获取数据。但它似乎进入了无限循环。 任何帮助将不胜感激。 - (UITableViewCell
我是 Swift 的新手,正在研究 dispatch_async 函数的工作原理。 API 文档显示 dispatch_async 有两个参数。但是,我可以传递一个参数,这没关系。 dispatch_
所以我运行了一段代码,我想提高性能,我注意到删除需要很长时间才能完成(大约 0.003 秒),所以我决定将它放入另一个线程,然后删除数组。 现在创建和运行线程所花费的时间比删除数组快得多,但是现在我创
我有以下代码... -(void) SetSerialNumber { NSLog(@"SetSerialNumber"); NSString *serialNum = textFie
假设我有以下代码: dispatch_async(dispatch_get_main_queue()) { myFunction() } 这表示异步调用调用 myFunction 的 bloc
我正在使用一些下载数据的代码。该代码使用 block 作为回调。有几种代码非常相似的下载方法:在回调 block 中,如果出现问题,它们会显示 UIAlertView。警报 View 始终如下所示:
我是 Swift 的新手,正在研究 dispatch_async 函数的工作原理。 API 文档显示 dispatch_async 有两个参数。但是,我可以传递一个参数,这没关系。 dispatch_
那么第一个问题就是dispatch_async是如何决定使用哪个线程的呢?只是随机选择它?我需要做一些解析和核心数据的事情,所以我不想阻塞 UI 线程并使用 dispatch_async,但在那之后我
假设我将任务异步分派(dispatch)到队列: { // we are on main queue dispatch_async(dispatch_get_global_queue(
我是一名优秀的程序员,十分优秀!