如何 运行 在后台编码?使用 dispatch_async 它是如何工作的?
How to run code in background ? using dispatch_async how it works?
我是 Swift.I 的新手,我有以下完美运行的代码。即我正在从电话簿中获取联系人并成功更新到 sqlite。
我的要求
我想 运行 在后台编码,即在我下面的代码中,我正在做的是每当电话簿中的某些联系人 added/deleted 我正在更新 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)
}
上面的代码我想运行在后台。
更新
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 把我上面的代码放在哪里?有哪些场景?
我们可以用dispatch_async来做。
例如,这是下载一些图像并存储在后台的 UserDefaults 中
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { () -> Void in
let imageData = NSData(contentsOfURL: NSURL(string: thankYouImageURL)!)
if let data = imageData {
print("Success Thanks Image")
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "registerThanksImage")
}else{
print("failure thanks image")
}
}
一般语法
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
// do background task
dispatch_async(dispatch_get_main_queue()) {
// update some UI
}
}
Grand Central Dispatch 中的异步调度在 Swift 中有语法糖。您可以在这里找到它:https://github.com/duemunk/Async
在后台 运行 您的代码非常容易。
就像这样:
Async.background {
println("This is run on the background queue")
}.main {
println("This is run on the main queue, after the previous block")
}
我是 Swift.I 的新手,我有以下完美运行的代码。即我正在从电话簿中获取联系人并成功更新到 sqlite。
我的要求
我想 运行 在后台编码,即在我下面的代码中,我正在做的是每当电话簿中的某些联系人 added/deleted 我正在更新 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)
}
上面的代码我想运行在后台。
更新
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 把我上面的代码放在哪里?有哪些场景?
我们可以用dispatch_async来做。
例如,这是下载一些图像并存储在后台的 UserDefaults 中
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { () -> Void in
let imageData = NSData(contentsOfURL: NSURL(string: thankYouImageURL)!)
if let data = imageData {
print("Success Thanks Image")
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "registerThanksImage")
}else{
print("failure thanks image")
}
}
一般语法
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
// do background task
dispatch_async(dispatch_get_main_queue()) {
// update some UI
}
}
Grand Central Dispatch 中的异步调度在 Swift 中有语法糖。您可以在这里找到它:https://github.com/duemunk/Async
在后台 运行 您的代码非常容易。
就像这样:
Async.background {
println("This is run on the background queue")
}.main {
println("This is run on the main queue, after the previous block")
}