记一次换新 iPhone

说来惭愧,一直还是在用公司配的开发机 5S, 没用上最新手机的主要原因可以归结为穷 ><。但最近 5S 的存储不够用了,再加上心仪的 8 降价了,一冲动就入了一个,嗯,这几个月做好了吃土的准备了。

iPhone 可以将旧手机数据迁移到新手机,这是我喜欢它的一个地方。苹果这篇将内容从旧 iOS 设备传输到新 iPhone、iPad 或 iPod touch详细介绍几种可行方法,我们可以从中选择一种方法。其实我觉得苹果应该出篇换机指南的,上面这篇文章的题目不是很容易让人把它与换机联系起来,也不是很容易记,这是我想记这么一笔的原因之一,N 年之后我再换 iPhone 的时候也可以按这篇文章的思想来指导自己迁移数据。

这里我选择使用 iTunes 备份恢复,快速开始功能好像不是很灵光,也可能是我不会用,而 iCloud 备份是通过网络,网速会影响备份和恢复,加上最近 iPhone 的 bug 贼多,这让我不是很放心。在此之前有使用过 iTunes 备份恢复,想着即使恢复过程出了问题备份还在,所以最终选择 iTunes。

备份过程很顺利,恢复过程就曲折了,iTunes 提示 backup is corrupt or incompatible,墨菲定理生效了,另一方面也佐证了选择 iTunes 是正确的选择,苹果什么时候能把这软件质量抓一抓,别只顾着赚钱啊。搜索找到了苹果对这个问题的解决办法:

继续阅读

多线程的 Core Data

平常在项目中没有使用过 Core Data, 因为我觉得它的学习曲线还挺陡峭,整个框架给人的感觉很复杂和笨重,因此一直没有使用它。但是看到喵神这份上级向的十个 iOS 开发面试题中和这份百度面试题中都有涉及到 Core Data 的内容,我想还是有必要好好研究一下它,毕竟它是 Apple 官方的持久化方案,我们可以取其精华,弃其糟粕,另一方面未来我们也可能因为各种原因接手或参与使用 Core Data 的项目。

这篇文章主要想探讨上面提到的面试题中的两个关于 Core Data 的问题:

  1. 你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?
  2. Core Data:中多线程中处理大量数据同步时的操作。

在回答这两个问题之前,我们先看 Apple 是怎么告诉我们使用多线程的 Core Data 的,在最新的(2017-03-27) Core Data Programming Guide 中有一节 Concurrency with Core Data,它没有直接说如何使用多线程,只是说了 managed object context 在多线程中的两种使用模式:

In Core Data, the managed object context can be used with two concurrency patterns, defined by NSMainQueueConcurrencyType and NSPrivateQueueConcurrencyType.

NSMainQueueConcurrencyType is specifically for use with your application interface and can only be used on the main queue of an application.

The NSPrivateQueueConcurrencyType configuration creates its own queue upon initialization and can be used only on that queue. Because the queue is private and internal to the NSManagedObjectContext instance, it can only be accessed through the performBlock: and the performBlockAndWait: methods.

继续阅读

Mac 使用笔记(二)

1. iPhone每次连接Mac都会弹出iPhoto

解决办法:

  1. Plug in your iPad/iPhone
  2. Open Image Capture
  3. Select your device (“devMikePad”)
  4. Press the triangle in square symbol in the lower left corner.
  5. Select “No application” in the menu.

iPhoto: Preferences > General > “Connecting Camera Opens …” set it to “No Application”

2. Add environment variable

1
2
// ~/.bash_profile
export var=value

3.SSH ask passpharse every time I use SSH key.

A:

1
$echo -e "AddKeysToAgent yes\nUseKeychain yes" >> ~/.ssh/config

4.Fix the Enable and Disable install software from anywhere in macOS Sierra

A:

1
2
3
4
5
// Enable
$ sudo spctl --master-disable

// Disable
$sudo spctl --master-enable

Reference:Fix the Enable and Disable install software from anywhere in macOS Sierra problem

5.Mac 上批量替换文件中的字符串

A:

1
$ grep -rl discription source/_posts | xargs sed -i ''  "s/discription/description/g"

Reference:linux 批量替换文件内容及查找某目录下所有包含某字符串的文件(批量修改文件内容)
论mac使用sed修改文件的正确姿势

6.如何查看占用指定端口的进程?

A:

1
$ lsof -i :[port]

结果输出中有进程的 pid, 之后我们可以用这个 pid 来杀掉该进程:

1
$ kill -9 [pid]

这些进程很可能是系统启动时就启动了,可以通过:

1
$ launchctl list | grep [pid]

来确认。如果找到有,而我们又不想它自启动了,可以在以下目录中找到配置文件:

1
2
3
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.

找到之后,可以用命令:

1
2
3
$ launchctl unload -w paths
// eg:
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
继续阅读