Я очень новичок в Swift.I есть следующий код, который отлично работает. т. е. я получаю контакты из PhoneBook и успешно обновляюсь в sqlite.Как запустить код в фоновом режиме? используя dispatch_async, как это работает?
Мое требование
Я хочу, чтобы запустить код в фоновом режиме т.е. в моем следующем коде, что я делаю, когда некоторые контакты добавлены/удалены в телефонной книге я обновляю SQLite. Эта функция постоянно я хочу. Он всегда должен работать в фоновом режиме.
Вот мой код
func getContactNames()
{
if !self.determineStatus()
{
print("not authorized")
return
}
let contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(adbk).takeRetainedValue()
print("records in the array \(contactList.count)")
var firstName : String = String()
var contactNumber : String = String()
var lastName : String = String()
var email : String = String()
var fullName : String = String()
let db = ContactsDBModel.sharedInstance()
var contacts : [ContactsModel!]?
contacts = db.selectAllFromContact()
print(contacts?.count)
if contacts?.count != contactList.count
{
db.deleteAllFromContact()
for record:ABRecordRef in contactList
{
if (ABRecordCopyValue(record,
kABPersonPhoneProperty) != nil)
{
if (ABRecordCopyValue(record,
kABPersonFirstNameProperty) != nil)
{
firstName = (ABRecordCopyValue(record, kABPersonFirstNameProperty)?.takeRetainedValue() as? String)!
let numbers:ABMultiValue = ABRecordCopyValue(record, kABPersonPhoneProperty).takeRetainedValue()
contactNumber = (ABMultiValueCopyValueAtIndex(numbers,0)?.takeRetainedValue() as? String)!
// print("first name =\(firstName)")
// print("contact number=\(contactNumber)")
if (ABRecordCopyValue(record,
kABPersonLastNameProperty) != nil)
{
lastName = (ABRecordCopyValue(record,
kABPersonLastNameProperty).takeRetainedValue()as? String)!
// print("last name =\(lastName)")
}
let emails: ABMultiValueRef = ABRecordCopyValue(record, kABPersonEmailProperty).takeRetainedValue()
for (var i = 0; i < ABMultiValueGetCount(emails); i++)
{
email = ABMultiValueCopyValueAtIndex(emails, i).takeRetainedValue() as! String
// print("email of person=\(email)")
}
}
}
fullName = firstName + lastName;
lastName = "";
print("fullName of person=\(fullName)")
print("email of person=\(email)")
print("contact number=\(contactNumber)")
db.insertIntoContact(contactNumber: contactNumber, contactName: fullName, contactEmail: email)
}
contacts = db.selectAllFromContact()
print(contacts?.count)
}
print(contacts?.count)
}
Приведенный выше код я хочу работать в фоновом режиме.
UPDATE
viewDidLoad
override func viewDidLoad()
{
super.viewDidLoad()
var emptyDictionary: CFDictionaryRef?
var addressBook: ABAddressBookRef?
func extractABAddressBookRef(abRef: Unmanaged<ABAddressBookRef>!) -> ABAddressBookRef?
{
if let ab = abRef
{
return Unmanaged<NSObject>.fromOpaque(ab.toOpaque()).takeUnretainedValue()
}
return nil
}
if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.NotDetermined)
{
print("requesting access...")
var errorRef: Unmanaged<CFError>? = nil
addressBook = extractABAddressBookRef(ABAddressBookCreateWithOptions(nil, &errorRef))
ABAddressBookRequestAccessWithCompletion(addressBook, { success, error in
if success {
self.getContactNames()
}
else
{
print("error")
}
})
}
else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Denied || ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Restricted)
{
print("access denied")
}
else if (ABAddressBookGetAuthorizationStatus() == ABAuthorizationStatus.Authorized)
{
print("access granted")
getContactNames()
}
}
dispatch_async
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
dispatch_async(dispatch_get_main_queue(), ^(void){
//Run UI Updates
});
});
Я слышал, с помощью dispatch_async мы можем запустить код в background.But, куда положить мой код выше ? каковы сценарии?
«Эта функция непрерывно я хочу всегда должен работать в фоновом режиме», вы не можете запустить что-то бесконечно в фоновом режиме, это не допускается в IOS. dispatch_async и очереди предназначены для перемещения CPU или интенсивных сетевых задач в фоновом режиме для обработки, чтобы поддерживать пользовательский интерфейс. Они не могут использоваться как слушатели –
нормально, но как использовать выше код в dispatch_async? Где мне нужно обновить свой код? на что это влияет? –
_ «Я слышал, используя dispatch_async, мы можем запускать код в фоновом режиме». Фактически, с 'dispatch_async' вы отправляете блок для выполнения в указанной очереди отправки. Это не «исполняемый код в фоновом режиме», где «фон» - это состояние выполнения [приложения] (https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html) , – CouchDeveloper