通过 Yii 框架从数据库导出大批量数据
最近有客户想一次性把客户的客资数据导出备份,经过几年的使用,很多客户的客资量都接近百万,如果要一次性导出这么多量,就不能直接从数据库读取放到数组里面,一个是 php 默认会限制内存使用量,另外内存也不应该浪费在这个上面。
Yii 框架提供了 BatchQueryResult
对象,该对象实现了 Iterator
接口,这样从数据库获取数据不会受限于内存,影响系统的稳定了。
环境说明:PHP 7.2
作者:Thomas Hanning 原文链接
C样式的循环将会在 Swift 3 中被移除。一开始看到似乎有点奇怪,但是 Swift 提供了更好的循环结构。
让我们先来看看C样式的循环:
let programmingLanguages = ["Swift","Objective-C","Java"]
for var i = 0; i < programmingLanguages.count; i++ {
print("index: \(i), value: \(programmingLanguages[i])")
}
这段代码运行没问题,但是它既不好用也不够 “swifty”。实际上,它不太容易学习和记忆。
作者:Thomas Hanning 原文链接
作为一个iOS开发者你应该去参加一些开发者大会。这是个学习新技术和结识其他开发者一个很好的机会。此外在大会中沟通交流也能锻炼自己。下面是2016年iOS开发者相关的会议列表。
作者:Thomas Hanning 原文链接
Objective-C 和 Swift 能很好的交互,所以在同一个项目中可以很容易的同时使用两者。
你可以在一个我们称它为 bridging-header
文件里面导入 Objective-C 文件。Xcode 会把这些(Objc 文件)转换成 Swift 可用,后面使用起来就感觉和 Swift 一样了。
创建 bridging-header
文件很容易,新建 Objective-C 类的时候,如果你的项目里面还没有 bridging-header
文件,Xcode 会提示你来新建(译注:确认之后建立的文件名是:项目名-Bridging-Header.h)。当然你可以选择不创建而自己手动来建立,直接新建 Objective-C 头文件,取名:Bridging-Header.h(译注:你也可以另外取个),然后定位到 “Build Settings”
里面的 “Swift Compiler – Code generation” 设置项,把 “Objective-C Bridging Header” 设置成刚才的文件名。
作者:Thomas Hanning 原文链接
在这篇文章里,我们将讨论通过使用 Network Link Conditioner 来模拟网络条件不好的情况。
iOS应用的运行环境相对于桌面计算机软件的运行环境要艰难的多,你只有有限的内存和CPU资源,更糟的是网络链接也不稳定。我们不仅在家里会使用应用,在火车上也会,当我们在咖啡店里面使用的时候,会有其他很多的手机应用都依赖一个网络,所以提供良好的用户体验是至关重要的,即使是在糟糕的网络环境下。
作者:Jameson Quave 原文链接
一个非常有用的功能就是在代码里面添加 IBInspectable 属性的背景图片。在一个娱乐类的应用里面,我写了一个可设计的 Cell,代码如下:
@IBDesignable
class TrailerCollectionViewCell: MediaCollectionViewCell {
@IBOutlet weak var lengthLabel: UILabel!
@IBInspectable weak var bgImage: UIImage! {
didSet {
imgView.frame = self.bounds
self.addSubview(imgView)
imgView.image = bgImage
imgView.contentMode = UIViewContentMode.Center
self.sendSubviewToBack(imgView)
}
}
}
作者:Natasha The Robot 原文链接
在我的这篇 Constructor Injection blog中,我写了一个结构体的例子,它有一个属性,属性可以从外部读取,但是写权限只能在内部,之前的代码看起来是这样的:
struct Counter {
// `count` here has to be a var
// but I never want to set the `count` externally,
// so I made it private
private var count: Int
// so this is the only way to access the count externally
func getCount() {
return count
}
}