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)
}
}//......
由於任務都完成塊,沒有必要爲dispatch_sync電話。如果您想在完成所有工作後執行一些最終操作,則可以使用派遣組。 – Paulw11
謝謝。我們是否需要函數內部的'dispatch_sync'? – Sumaira