2015-01-01 3 views
-1

Как я могу создать зависимость для функций в быстром запуске один за другим? Другими словами, я хочу, чтобы одна функция подождала, пока другая завершит свою задачу успешно.Зависимость от функций в Swift

var sales : NSMutableArray! = NSMutableArray() 
var items : NSMutableArray! = NSMutableArray() 


override func viewDidLoad() { 
super.viewDidLoad() 

Здесь мне нужна помощь, ниже способ доставки не работает должным образом, я получаю «индекс 0 вне границ для пустого массива» ошибки, так как массив не заселен еще я думаю. Также я не уверен, что если это правильный метод для обработки этого ...

/* 
     dispatch_async(queue, { 

      dispatch_sync(queue, { 
       self.downloadItems() 
      }) 

      dispatch_sync(dispatch_get_main_queue(), { 
       self.displayItems() 
      }) 
     }) 
*/ 

} 

func downloadItems() { 

let urlPath = "……………………………" 
let url = NSURL(string: urlPath) 

let session = NSURLSession.sharedSession() 
let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in 

    if (error != nil) { 
     println(error) 
    } else { 

    let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil)! 

    dispatch_async(dispatch_get_main_queue()) { 

     for var i = 0; i < jsonResult.count; i++ { 
      self.sales[i] = jsonResult[i]["daily_sales"] as NSString 

     } 
    } 
    } 
    }) 

task.resume() 

} 


func displayItems() { 

self.items.addObject(["amount": self.sales[0]]) 

} 
+1

Вы должны попробовать написать код, пост, который с описанием проблем, SO о помощи кода записи, не предоставляя код. – zaph

+0

Посмотрите на очереди отправки с группами - вы можете дождаться их завершения. –

+0

Синхронные функции? Асинхронные функции? – Rob

ответ

0

Использовать стиль продолжения прохождения. Ваша операция downloadItems() будет принимать аргумент с функцией для выполнения после завершения downloadItems() - аргумент аналогичен аргументу continuation (который некоторые языки предоставляют, см. Схему и ML для деталей). Так он выглядит:

func downloadItems (continuation: (Void -> Void)!) { 
    let urlPath = // ... 
    // ... 

    if nil != continuation { continuation() } 
} 

, а затем вы будете использовать его с

self.downloadItems { [self unowned] in self.displayItems() } 
+0

Спасибо, но я все равно получаю ту же ошибку: *** Завершение приложения из-за неотображенного исключения «NSRangeException», причина: «*** - [__ NSArrayM objectAtIndex:]: индекс 0 за пределами для пустого массива ' – commodore64

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