2016-12-09 34 views
0

我想運行一些相互依賴的任務,因此應按順序執行。目前,它阻止了我的UI線程,並且在訂購時也存在一些問題。不按照正確的順序進行如何在iOS中運行相互依賴的運行任務

  • 任務:關於這一問題

    夫婦。如果我們希望一個接一個地執行它們,會做出什麼改變

  • 代碼是否在內存使用和資源消耗方面進行了優化?如何進一步優化?
  • 我們是否需要在函數調用中使用全局隊列,如下面的代碼所示?

這是我的代碼細節。我創造了一些串行隊列如下:

var Q0_sendDisplayName=dispatch_queue_create("Q0_sendDisplayName",DISPATCH_QUEUE_SERIAL) 
var Q1_fetchFromDevice=dispatch_queue_create("fetchFromDevice",DISPATCH_QUEUE_SERIAL) 
var Q2_sendPhonesToServer=dispatch_queue_create("sendPhonesToServer",DISPATCH_QUEUE_SERIAL) 

我有一個串行隊列,爲了執行任務,所以我已經呼籲串行隊列我的任務的想法。這裏是我的代碼:

dispatch_sync(Q0_sendDisplayName, 
     { 
      self.sendNameToServer(displayName){ (result) ->() in 

       dispatch_sync(self.Q1_fetchFromDevice, 
        { 
         self.SyncfetchContacts({ (result) ->() in 


          dispatch_sync(self.Q2_sendPhonesToServer, 
           {  self.SyncSendPhoneNumbersToServer(self.syncPhonesList, completion: { (result) in 



               //....... 
               //.... 

這些函數中的代碼也在全局隊列上運行。不知道這是否是一種正確的編碼方式。我使用完成處理程序來通知該方法已完成執行。下面是函數1的代碼:

func sendNameToServer(var displayName:String,completion:(result:Bool)->()) 
    { 
    Alamofire.request(.POST,"\(urlToSendDisplayName)",headers:header,parameters:["display_name":displayName]).responseJSON{ 
      response in 
      switch response.result { 
       case .Success: 
        return completion(result: true) //...... 

這裏是函數2的代碼。這個函數很長,因爲它讀取整個聯繫簿,所以我把它放在全局隊列中(不知道它是否是正確的方式)。我在主隊列上調用完成處理程序。這裏是代碼:

func SyncfetchContacts(completion:(result:Bool)->()) 
{ 
    let contactStore = CNContactStore() 

    var keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataAvailableKey,CNContactThumbnailImageDataKey, CNContactImageDataKey] 
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){ 

    do { 

     try contactStore.enumerateContactsWithFetchRequest(CNContactFetchRequest(keysToFetch: keys)) { (contact, pointer) -> Void in 
      if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { 
       for phoneNumber:CNLabeledValue in contact.phoneNumbers { 
        let a = phoneNumber.value as! CNPhoneNumber 

     } 
     } 
     } 
     dispatch_async(dispatch_get_main_queue()) 
     { 
      completion(result: true) 
     } 
     } 
//........ 

這裏是功能3碼再次裏面有一個全局隊列(不知道它右)和主隊列調用完成處理程序。

func SyncSendPhoneNumbersToServer(phones:[String],completion: (result:Bool)->()){ 
    Alamofire.request(.POST,"\(url)",headers:header,parameters:["display_name":displayName]).responseJSON{ 
     response in 
     switch response.result { 
      case .Success: 
         dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)) 
      { 
       //enter some large data in database in a loop 
       dispatch_async(dispatch_get_main_queue()) 
       { 
       return completion(result: true) 
       } 


      }//...... 
+0

由於任務都完成塊,沒有必要爲dispatch_sync電話。如果您想在完成所有工作後執行一些最終操作,則可以使用派遣組。 – Paulw11

+0

謝謝。我們是否需要函數內部的'dispatch_sync'? – Sumaira

回答

0

SyncfetchContacts您呼叫的完成處理程序之前contactStore.enumerateContactsWithFetchRequest已經完成,其完成關閉之外。

只需在那裏移動:

func SyncfetchContacts(completion:(result:Bool)->()) { 

    ... 

    do { 

     try contactStore.enumerateContactsWithFetchRequest(CNContactFetchRequest(keysToFetch: keys)) { (contact, pointer) -> Void in 
      if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) { 
       for phoneNumber:CNLabeledValue in contact.phoneNumbers { 
        let a = phoneNumber.value as! CNPhoneNumber 

       } 
      } 
      // here ... 
      dispatch_async(dispatch_get_main_queue()) { 
       completion(result: true) 
      } 
     } 
// ... not here. 
//   dispatch_async(dispatch_get_main_queue()) { 
//    completion(result: true) 
//   } 
    } 
} 
相關問題