请求访问地址簿时应用程序冻结
Posted
技术标签:
【中文标题】请求访问地址簿时应用程序冻结【英文标题】:App freezes when requesting access to addressbook 【发布时间】:2016-12-23 23:46:15 【问题描述】:func getContacts()
let store = CNContactStore()
if CNContactStore.authorizationStatus(for: .contacts) == .notDetermined
store.requestAccess(for: .contacts, completionHandler: (authorized: Bool, error: NSError?) -> Void in
if authorized
self.retrieveContactsWithStore(store: store)
as! (Bool, Error?) -> Void)
else if CNContactStore.authorizationStatus(for: .contacts) == .authorized
self.retrieveContactsWithStore(store: store)
func retrieveContactsWithStore(store: CNContactStore)
do
let groups = try store.groups(matching: nil)
let predicate = CNContact.predicateForContactsInGroup(withIdentifier: groups[0].identifier)
//let predicate = CNContact.predicateForContactsMatchingName("John")
let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactEmailAddressesKey] as [Any]
let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch as! [CNKeyDescriptor])
self.objects = contacts
DispatchQueue.main.async(execute: () -> Void in
self.myTableView.reloadData()
)
catch
print(error)
我试图从通讯录中检索联系人,但每当我转到调用 getContacts() 的视图时,应用程序就会冻结。它不再继续,但也没有崩溃。我想知道这里出了什么问题?
【问题讨论】:
【参考方案1】:您调用requestAccess
的代码不正确。完成处理程序的语法无效。你需要这个:
func getContacts()
let store = CNContactStore()
let status = CNContactStore.authorizationStatus(for: .contacts)
if status == .notDetermined
store.requestAccess(for: .contacts, completionHandler: (authorized: Bool, error: Error?) in
if authorized
self.retrieveContactsWithStore(store: store)
)
else if status == .authorized
self.retrieveContactsWithStore(store: store)
还要注意使用status
变量的更改。这比一遍又一遍地调用authorizationStatus
更清晰、更容易阅读。调用一次,然后根据需要反复检查该值。
【讨论】:
此代码在 else status == .authorized 部分有错误,上面写着“修复它插入”、“” 糟糕。我过度编辑。在其中添加if
。查看更新。
还有一个错字 - 错过了右括号。
老兄,我应该在这个函数的参数中输入什么?让谓词 = CNContact.predicateForContactsInGroup(withIdentifier: )
这是一个完全不同的问题。如果在进行了适当的研究(阅读文档和搜索)后仍找不到解决方案,请针对您的新问题发布一个新问题。以上是关于请求访问地址簿时应用程序冻结的主要内容,如果未能解决你的问题,请参考以下文章
Cx_Freezing PySide,praw,请求应用程序在冻结时停止工作
phonegap ios:当用户为权限请求框选择“不允许”时,推送通知冻结
使用 axios 向服务器发出请求会冻结 React Native 应用程序
从 NetworkAccessManager->get() 回调访问 QList<QLlnkedList<QUrl>* > 时 Qt 应用程序冻结