PLAYGROUND 延时运行

由 王巍 (@ONEVCAT) 发布于 2015/09/16

从 WWDC 14 的 Keynote 上 Chris 的演示就能看出 Playground 异常强大,但是从本质来说 Playground 的想法其实非常简单,就是提供一个可以即时编辑的类似 REPL 的环境。

Playground 为我们提供了一个顺序执行的环境,在每次更改其中代码后整个文件会被重新编译,并清空原来的状态并运行。这个行为与测试时的单个测试用例有一些相似,因此有些时候在测试时我们会遇到的问题我们在 Playground 中也会遇到。

其中最基础的一个就是异步代码的执行,比如这样的 NSTimer 在默认的 Playground 中是不会执行的:

class MyClass {
@objc func callMe() {
print("Hi")
}
} let object = MyClass() NSTimer.scheduledTimerWithTimeInterval(1, target: object,
selector: "callMe", userInfo: nil, repeats: true)

关于 selector 的使用 和 @objc 标记可以分别参见 Selector 以及 @objc 和 dynamic

在执行完 NSTimer 语句之后,整个 Playground 将停止掉,Hi 永远不会被打印出来。放心,这种异步的操作没有生效并不是因为你写错了什么,而是 Playground 在执行完了所有语句,然后正常退出了而已。

为了使 Playground 具有延时运行的本领,我们需要引入 Playground 的 “扩展包” XCPlayground 框架。现在这个框架中包含了几个与 Playground 的行为交互以及控制 Playground 特性的 API,其中就包括使 Playground 能延时执行的黑魔法,XCPSetExecutionShouldContinueIndefinitely

我们只需要在刚才的代码上面加上:

import XCPlayground
XCPSetExecutionShouldContinueIndefinitely(true)

就可以看到 Hi 以每秒一次的频率被打印出来了。

在实际使用和开发中,我们最经常面临的异步需求可能就是网络请求了,如果我们想要在 Playground 里验证某个 API 是否正确工作的话,使用 XCPlayground 的这个方法开启延时执行也是必要的:

let url = NSURL(string: "http://httpbin.org/get")!

let getTask = NSURLSession.sharedSession().dataTaskWithURL(url) {
(data, response, error) -> Void in
let dictionary = try! NSJSONSerialization.JSONObjectWithData(data!, options: []) print(dictionary)
} getTask.resume()

延时运行也是有限度的。如果你足够有耐心,会发现在第一个例子中的 NSTimer 每秒打印一次的 Hi 的计数最终会停留在 30 次。这是因为即使在开启了持续执行的情况下,Playground 也不会永远运行下去,默认情况下它会在顶层代码最后一句运行后 30 秒的时候停止执行。这个时间长度对于绝大多数的需求场景来说都是足够的了,但是如果你想改变这个时间的话,可以通过 Alt + Cmd + 回车 来打开辅助编辑器。在这里你会看到控制台输出和时间轴,将右下角的 30 改成你想要的数字,就可以对延时运行的最长时间进行设定了。

之前的像是 GCD 和延时调用这样的章节中也涉及到了延时运行,你可以将这里的技巧应用到之前的示例代码上,这样你就可以在 Playground 中得到正确的结果了。

PLAYGROUND 延时运行的更多相关文章

  1. 重新延时运行的Js 实现

    场景 1. AutoComplete 插件, 当用户的输入空闲0.5s 时,才向服务发送请求.而不是用户输入每一个字符都要请求服务器. 2. 图片懒加载时,用户拖动滚动条空闲0.5s时,才遍历懒加载的 ...

  2. Swift开发第三篇——Playground

    本篇分为两部分: 一.Playground的延时运行 二.Playground的可视化 一.Playground的延时运行 Playground 就是提供一个可以即时编译的类似 REPL 的环境,他为 ...

  3. Spark菜鸟学习营Day6 分布式代码运行调试

    Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...

  4. 使用Playground编写第一个Swift程序

    从控制台输出“HelloWorld”是我学习C语言的第一步,也是我人生中非常重要的一步.多年后的今天,我仍希望以HelloWorld作为第一步,与大家共同开启一个神奇.瑰丽的世界——Swift编程. ...

  5. C# 在类中使用Timer定时器以及延时处理的方法

    我们平时在C#中要用到定时功能时,有自带定时器,一般在定时器里面写函数就行了,现在需要在类里面写了一个定时器,不和界面绑定,一开始的时候感觉没什么思路,然后看了一下界面的设计代码,有了思路,还是很简单 ...

  6. 深入了解Go Playground

    简介 2010年9月,我们介绍了Go Playground,这是一个完全由Go代码组成和返回程序运行结果的web服务器. 如果你是一位Go程序员,那你很可能已经通过阅读Go教程或执行Go文档中的示例程 ...

  7. 《从零开始学Swift》学习笔记(Day4)——用Playground工具编写Swift

    Swift 2.0学习笔记(Day4)——用Playground工具编写Swift 原创文章,欢迎转载.转载请注明:关东升的博客 用Playground编写Swift代码目的是为了学习.测试算法.验证 ...

  8. [书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型

    本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解J ...

  9. 合宙Luat | 一文读懂LuaTask延时,看我如何从《射雕英雄传》角度分析。

    武侠小说中,主人公之所以能纵横江湖,常常离不开一样可遇不可求的绝世法宝--武功秘籍.如今勇于尝试的开发者,笃定地告诉后来者:选Luat二次开发,就如同拥有了物联网开发的武功秘籍. 本期让我们通过< ...

随机推荐

  1. OPENGL_三角形带GL_TRIANGLE_STRIP详解

    使用三角形带原因:减少顶点传递,渲染时api向显卡传输数据量是瓶颈,用较好的传递方法传递一个三角形最少可以少于一个点. 点的顺序根据奇数,偶数不一样的原因:保持所有三角形法线在同一方向. 原文:htt ...

  2. nginx,tomcat,apache三者分别用来做什么,有何区别

    1. Nginx和tomcat的区别 nginx常用做静态内容服务和代理服务器,直接外来请求转发给后面的应用服务器(tomcat,Django等),tomcat更多用来做一个应用容器,让java we ...

  3. springMVC-接收数据-参数绑定

    接收数据-参数绑定 #Method Arguments概观 Same in Spring WebFlux The table below shows supported controller meth ...

  4. BIO,NIO,AIO总结

    熟练掌握 BIO,NIO,AIO 的基本概念以及一些常见问题是你准备面试的过程中不可或缺的一部分,另外这些知识点也是你学习 Netty 的基础. BIO,NIO,AIO 总结 1. BIO (Bloc ...

  5. c#中的特性

    c#中的特性 特性在我的理解就是在类或者方法或者参数上加上指定的标记,然后实现指定的效果. 和Java中的注解@Annotation类似. c#内置的特性之Obsolete [Obsolete(&qu ...

  6. 通用全局CSS样式

    PC全局样式 *{padding:0;margin:0;} div,dl,dt,dd,form,h1,h2,h3,h4,h5,h6,img,ol,ul,li,table,th,td,p,span,a{ ...

  7. P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib

    题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组 ...

  8. IT人怎样防止过劳死?如何成为时间的主人?

    投行的朋友还没走几天,搜狐的一位同胞又去了.又是过劳死!    每当读到这类新闻,IT人无不反镜自照,顾影自怜.无法拼爹拼钱的我们,似乎只有拼命了.生活好惨淡啊!    有人说:年轻人,悠着点儿!立刻 ...

  9. 7.html超链接的使用

    <html> <head> <title>第七课网页标签</title> <meta charset="utf-8"> ...

  10. spark常用参数

    val conf = new SparkConf().setAppName("WordCount_groupBy").setMaster("local") // ...