我有很多代码在Swift 2.x(或甚至1.x)项目,看起来像这样:
// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,0)) {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    dispatch_async(dispatch_get_main_queue()) {
        self.imageView.image = image
    }
}

或者像这样的东西延迟执行:

dispatch_after(dispatch_time(disPATCH_TIME_Now,Int64(0.5 * Double(NSEC_PER_SEC))),dispatch_get_main_queue()) {
    print("test")
}

或者Grand Central dispatch API的任何其他用途…

现在我已经打开我的项目在Xcode 8(测试版)为Swift 3,我得到各种错误。其中一些提供修复我的代码,但不是所有的修复工作。哈尔!

从一开始,Swift提供了一些设施,使ObjC和C更多Swifty,每个版本增加更多。现在,在Swift 3中,新的 “import as member”特性允许具有某些样式的C API的框架 – 其中你有一个类似于一个类的数据类型,以及一些全局函数 – 更像Swift API。数据类型作为Swift类导入,它们相关的全局函数作为方法和这些类上的属性导入,以及一些相关的东西,例如常量集合,在适当的时候可以变成子类型。

在Xcode 8 / Swift 3测试版中,苹果已经应用了这个功能(以及其他几个),使dispatch框架更加Swifty。 (和Core Graphics一样。)如果你一直在跟踪Swift的开源工作,this isn’t news,但现在是第一次它是Xcode的一部分。

将任何项目移动到Swift 3的第一步应该是在Xcode 8中打开它,然后选择Edit>转换>到当前Swift语法…在菜单中。这将适用于所有重命名的API和其他更改,同时需要您的审核和批准所有更改。 (通常,代码行同时受到多个更改的影响,因此响应错误修复 – 它单独可能无法处理一切)。

结果是,弹跳工作的背景和背面的常见模式现在看起来像这样:

// Move to a background thread to do some long running work
dispatchQueue.global(attributes: .qosUserInitiated).async {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    dispatchQueue.main.async {
        self.imageView.image = image
    }
}

注意,我们使用qosUserInitiated而不是一个旧的disPATCH_QUEUE_PRIORITY常量。在OS X 10.10 / iOS 8.0中引入了服务质量(QoS)说明符,为系统优先处理工作和废弃旧的优先级说明符提供了更清晰的方式。有关详细信息,请参阅Apple的docs on background work and energy efficiency。

顺便说一下,如果你保持自己的队列组织工作,获得一个方法现在看起来像这样(注意dispatchQueueAttributes是一个OptionSet,所以你使用收集风格的字面量组合选项):

class Foo { 
    let myQueue = dispatchQueue(label: "com.example.my-serial-queue",attributes: [.serial,.qosUtility])
    func doStuff() {
        queue.async {
            print("Hello World")
        }
    }
}

使用dispatch_after以后工作?这也是一个队列上的方法,它需要一个dispatchTime,它有各种数字类型的运算符,所以你可以只添加整数或分数秒:

dispatchQueue.main.asyncAfter(deadline: .Now() + 0.5) { // in half a second...
    print("Are we there yet?")
}

你可以通过在Xcode 8中打开它的接口找到你的方式 – 使用Open快速找到dispatch模块,或者在你的Swift项目/ playground中放置一个符号(如dispatchQueue),然后命令点击它,然后打开围绕模块从那里。 (您可以在Apple的庞大的新API参考网站和in-Xcode doc查看器中找到Swift Dispatch API,但它似乎只是C版本的文档内容尚未移动到它)。

有关更多提示,请参阅Migration Guide。

我如何dispatch_sync,dispatch_async,dispatch_after等在Swift 3?的更多相关文章

  1. xcode8 – 如何在不更新macOS的情况下安装Xcode 8?

    有没有人有任何想法安装Xcode8而不更新macOS?

  2. ios – Xcode – 我的应用程序崩溃,错误是“无效指针从空闲列表中排队***在malloc_error_break中设置一个断点来调试”

    我的应用程序在模拟器上运行完美.但是当我在设备上运行它时,应用程序崩溃和显示错误:“malloc:*errorforobject0x17415d0c0:Invalidpointerdequeuedfromfreelist*setabreakpointinmalloc_error_breaktodebug”;我在malloc_error_break中搜索并设置了一个断点来进行调试,但仍然找不到问题.

  3. ios – Swift 3中的UIImagePickerController

    我最近使用开发人员测试版更新了Xcode8中的Swift3.我正在尝试实施FirebaseAuth,一切进展顺利.我的问题:我正在尝试将图像作为用户的个人资料图片上传到Firebase数据库.我以为我可以使用UIImagePickerController来做到这一点,但是当我这样做时,我得到了一个“Thread7:SignalSIGABRT我知道这通常表示什么,但我检查了,当我点击它时,我的图像确

  4. 使用 StackView 实现魔术般的视图旋转适配

    它在竖屏下看起来挺好的,但是一旦屏幕旋转了,就不那么好看了...可是呢,仅仅改为在Storyboard中使用一个简单的StackView,你就可以拥有一个好用的旋转适配效果了。为了实际看看这个过程,我推荐在Storyboard中改变到水平方向模式。这招就是在高度为紧凑的时候把StackView设为水平方向的。要做到这个,选中StackView,然后来到属性视图。你会发现在StackView轴向属性下面的一个小小的+--点击它!

  5. 【译】Swift 3.0更新概要

    作者:BenMorrow译者:kemchenjSwift3.0年末就会发布正式版,并且会给所有Swift开发者带来很多改变.如果你没有一直紧跟SwiftEvolution的话,你也许会想知道都有哪些改变,以及它将会怎么影响你的代码,并且你该什么时候开始着手把代码convert到3.0,那这篇文章就是写给你的.这篇文章里,我将会着笔于那些对你的代码会有重大影响的Swift3的新特性.开始吧!

  6. 一个才适应Swift2.2的开发者眼中的Swift 3.0和iOS 10

    食用指南Xcode8带着Swift3风风火火的到来了,作为一个平时使用OC为主的iOS开发来说,Swift3正式和OC-like语法划定了界限。您可以简单浏览本文,也可以把本文当做从Swift2.2迁移到Swift3的指南。如果您打开一个Swift2工程,迁移会主动提示您打开了一个Swift的旧工程,问您是不是要自动进行语法转换。

  7. 我如何dispatch_sync,dispatch_async,dispatch_after等在Swift 3?

    现在我已经打开我的项目在Xcode8(测试版)为Swift3,我得到各种错误。在Xcode8/Swift3测试版中,苹果已经应用了这个功能,使dispatch框架更加Swifty。有关详细信息,请参阅Apple的docsonbackgroundworkandenergyefficiency。顺便说一下,如果你保持自己的队列组织工作,获得一个方法现在看起来像这样:使用dispatch_after以后工作?

  8. Swift学习之"Use Legacy Swift Language Version"报错

    swift第三方库迁移错误解决Xcode8导入框架出现UseLegacySwiftLanguageVersion的报错Xcode8导入框架出现UseLegacySwiftLanguageVersion的报错Swift3.0已出坑-适配iOS10,项目迁移Swift3.0问题总结。

  9. Swift:iOS App 上传App Store -xcode8.3.3

    APP项目MacOS:macOSSierra10.12.5XCode版本:Version8.3.3(8E3004b)Swift语言:3.0上传方法:archive-validate-export-applicationloader上传appstore总结:刚开始用的是xcode7,swift2.0语法开发的项目,后来在上传appstore过程中遇到了很多问题,包括要支持64-bit和32-bit等

  10. dyld: Library not loaded: @rpath/libswiftCore.dylib #import “项目名-Swift.h”失效

    改为Xcode9之后,出现错误:dyld:Librarynotloaded:@rpath/libswiftCore.dylib点击工程->targets->buildsetting/all搜索embe,把EmbeddedContentContainsSwiftCode设置为YES,这个设置在xcode8中已经没有必要了,因为xcode8已经改为AlwaysEmbedSwiftStandardLib

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部