1、显示CoreData执行的SQL语句
2、监听UITextView键盘的发送按钮
3、设置CoreData实体唯一约束
4、iOS9关于canOpenURL不生效
5、OC变参函数
显示CoreData执行的SQL语句
设置步骤(-com.apple.CoreData.SQLDebug 1
):
打印结果:
在获得对应的表后,可以通过sqlite3命令进行打印:
1 | $ sqlite3 /Users/songruiwang/Desktop/1.sqlite |
执行help查询对应的命令:
1 | sqlite> .help |
如果要显示表内容的话,可以执行以下命令:
1 | sqlite> .mode line |
更多详细的操作可以通过help查看。
监听UITextView键盘的发送按钮
UITextField有代理方法监听是否点击了发送按钮:
1 | - (BOOL)textFieldShouldReturn:(UITextField *)textField; |
不过UITextView因为可以输入多行的关系,所以没有类似的代理方法。那么在作为聊天输入框的时候,就必须利用其它代理方法来实现:
1 | - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { |
上面的代码块就是一种实现方式,只是需要去除输入换行的功能,不过作为聊天输入框,舍弃这个功能也是可以接受的。
设置CoreData实体唯一约束
在iOS9以前,不希望CoreData中出现相同的实体可以通过先查询后判断的形式实现。在iOS9以后,iOS提供了另外的设置,可以直接达到这个目的。设置步骤如下:
首先需要在CoreData配置实体属性中添加作为唯一标识的属性:
然后在managedObjectContext上下文中添加合并策略,以便在遇到相同实体时进行更新:
1 | lazy var managedObjectContext: NSManagedObjectContext = { |
这样当执行以下测试代码时:
1 | // 模型 |
会输出:
1 | Optional("3") 4 Optional(4) |
可以看到最后一个实体在不断地更新,并没有添加新的实体到sqlite中。
不过需要注意的一点是当执行save操作后,后面创建的约束值相同的实体会被清为default
,即除了第一个person,后面的person实体都会被清为default。
还有唯一约束一般结合NSFetchedResultsController使用,由NSFetchedResultsController来管理实体,就不用担心自己已经存储的有值的实体被清为defalut了(这里可以用先查后创建的方式避免,不过这样的话代码逻辑就和没有用这个约束一样了),因为在约束值相同的情况下,NSFetchedResultsController根本不会将其存入,进而不会触发对应的刷新代理方法。
iOS9关于canOpenURL不生效
系统在iOS9之后加强了隐私保护,需要在info.plist中设置LSApplicationQueriesSchemes
来添加要跳转的对应URL scheme,canOpenURL才会生效。
详细地址:
session 703 privacy and your app
OC变参函数
一个项目中各个API的host可能并不一样,所以最好有一个方法能够预置对应API的host,除了宏,变参函数是个很好的选择,如下:
1 | + (NSString *)jobURLStringWithPath:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2){ |
这样就可以进行以下调用来获取url字符串:
1 | [BaseAPI jobURLStringWithPath:@"/deliveries.json"] |
相对来说还是比较方便的。