2015-11-18 3 views
0

Я очень новичок в 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, куда положить мой код выше ? каковы сценарии?

+2

«Эта функция непрерывно я хочу всегда должен работать в фоновом режиме», вы не можете запустить что-то бесконечно в фоновом режиме, это не допускается в IOS. dispatch_async и очереди предназначены для перемещения CPU или интенсивных сетевых задач в фоновом режиме для обработки, чтобы поддерживать пользовательский интерфейс. Они не могут использоваться как слушатели –

+0

нормально, но как использовать выше код в dispatch_async? Где мне нужно обновить свой код? на что это влияет? –

+0

_ «Я слышал, используя dispatch_async, мы можем запускать код в фоновом режиме». Фактически, с 'dispatch_async' вы отправляете блок для выполнения в указанной очереди отправки. Это не «исполняемый код в фоновом режиме», где «фон» - это состояние выполнения [приложения] (https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html) , – CouchDeveloper

ответ

1

Мы можем использовать 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 
     } 
    } 
+0

В моем случае в viewDidLoad количество строк есть оттуда, я дважды вызываю getContactNames. Теперь, где мне нужно изменить свой код? –

+0

U r вызов только один раз. Его с if else loop .. В то время только один вызов getContactNames –

+0

Дважды !! если предоставлено разрешение на первый раз и второе, если разрешение уже было предоставлено. –

0

Там же синтаксический сахар в Swift для асинхронных отправок в Диспетчер Grand Central. Вы можете найти его здесь: 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") 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^