请求访问地址簿时应用程序冻结

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 应用程序冻结

当我进行 api 调用时如何阻止 winforms 应用程序冻结