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. hadoop 2.5.1单机安装部署伪集群

    环境:ubuntu 14.04 server 64版本 hadoop 2.5.1 jdk 1.6 部署的步骤主要参考了http://blog.csdn.net/greensurfer/article/ ...

  2. plt

    设定X,Y轴的长度以及刻度的方法. import numpy as np import matplotlib.pyplot as plt data = np.arange(0,1.1,0.01) pl ...

  3. bzoj1966:[AHOI2005]病毒检测

    传送门 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: #include<cstdio> #include<iostream> #includ ...

  4. day04 异常

  5. Java语言和虚拟机规范下载

  6. mongodb数据库下载链接,相关配置(转载),官方api

    下载链接:http://dl.mongodb.org/dl/win32/x86_64 配置:http://blog.sina.com.cn/s/blog_685213e70101g81t.html 官 ...

  7. 线段树-单点更新-HDU 1166 敌兵布阵

    #include <iostream> #include <cstdio> #include <string> #include <cstring> u ...

  8. G-华华对月月的忠诚

    链接:https://ac.nowcoder.com/acm/contest/392/G 题意: 月月要参加学校的信息学集训,晚上不能陪华华聊天了.不过为了防止华华去和别的小姐姐聊天,浪费时间影响学习 ...

  9. UVA-11584:Partitioning by Palindromes(基础DP)

    今天带来一个简单的线性结构上的DP,与上次的照明系统(UVA11400)是同一种类型题,便于大家类比.总结.理解,但难度上降低了. We say a sequence of characters is ...

  10. Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

    转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...