Я сделал приложение, используя контакты из контактной книги.
Проблема: - я обновляю/добавляю/удаляю контакт из книги контактов, а затем возвращаюсь в свое приложение.
Мое приложение applicationDidBecomeActive активно пишет следующий код: -
NotificationCenter.default.addObserver(
self,
selector: #selector(self.addressBookDidChange),
name: NSNotification.Name.CNContactStoreDidChange,
object: nil)
После этого метод addressBookDidChange вызывается несколько раз, и пользовательский интерфейс приложения зависает. Я также пытался загрузить контакт в фоновом режиме, но приложение вылетало случайным образом.
1) Объявление контактного массива: -
public var GlobalContactArray = [ContactEntry]()
2) загрузите контакт в фоновом режиме: -
DispatchQueue.main.async
{
PKHUD.sharedHUD.contentView = PKHUDProgressView()
PKHUD.sharedHUD.show()
}
DispatchQueue.global(qos: .background).async
{
self.requestAccessToContacts
{ (success) in
if success
{
self.retrieveContacts({ (success, contacts ) in
if success && (contacts?.count)! > 0
{
self.GlobalContactArray = contacts!
for arrcontact in contacts!
{
self.GetStoreConatcts(arrcontact)
}
}
})
}
}
}
3) метод получения контактов: -
self.GlobalContactArray.removeAll()
do
{
let contactsFetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactImageDataKey as CNKeyDescriptor, CNContactImageDataAvailableKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor])
try contactStore.enumerateContacts(with: contactsFetchRequest, usingBlock:
{
(cnContact, error) in
if let contact = ContactEntry(cnContact: cnContact)
{
if self.GlobalContactArray.contains(contact)
{
}
else
{
self.GlobalContactArray.append(contact)
}
}
})
if self.GlobalContactArray.count == 0
{
}
else
{
if Constants.isLogin == "1"
{
DispatchQueue.main.async
{
NotificationCenter.default.post(name: Notification.Name("LoadContactList"), object: nil)
}
}
else
{
UserDefaults.standard.set(true, forKey: "ContactViewDisapper")
UserDefaults.standard.synchronize()
}
}
completion(true, self.GlobalContactArray)
}
catch
{
completion(false, nil )
}
4) После завершения этого метода обновите/добавьте контакт в локальную базу данных, используя базовую базу данных. Для добавления/обновления метода локальной базы данных имя метода «self.GetStoreConatcts(arrcontact)». В этом проходе один за другим контакт .Используя этот контакт, проверьте в БД, если он доступен, затем обновите контакт, а недоступен, затем добавьте контакт.
Я выполнил выше всех шагов, контакт также обновляет/добавляет/удаляет, но приложение аварийно завершает работу.
так что у кого-нибудь есть решение, как загрузить метод в фоновом режиме, пожалуйста, помогите мне.
Заранее спасибо.