2016-12-10 9 views
0
@IBAction func sendSweet(sender: UIBarButtonItem) { 

    var inputTextField: UITextField? 
    let alert = UIAlertController(title: "New sweet", message: "Enter a sweet", preferredStyle: .alert) 
    alert.addTextField { (textField: UITextField) in 
     textField.placeholder = "Your sweet" 
     inputTextField = textField 
    } 

    let sendAction = UIAlertAction(title: "Send", style: .default, handler: { 
     [weak self] (alertAction: UIAlertAction) in 
     guard let strongSelf = self else { return } 

     if inputTextField?.text != "" { 
      let newSweet = CKRecord(recordType: "Sweet") 
      newSweet["content"] = inputTextField?.text as CKRecordValue? 

      let publicData = CKContainer.default().publicCloudDatabase 
      publicData.save(newSweet, completionHandler: { 
       (record: CKRecord?, error: Error?) in 

       if error == nil { 
        // we want ui code to dispatch asychronously in main thread 
        DispatchQueue.main.async { 
         strongSelf.tableView.beginUpdates() 
         strongSelf.sweets.insert(newSweet, at: 0) 
         let indexPath = IndexPath(row: 0, section: 0) 
         strongSelf.tableView.insertRows(at: [indexPath], with: .top) 
         strongSelf.tableView.endUpdates() 
        } 
       } else { 
        if let error = error { 
         print(error.localizedDescription) 
         return 
        } 
       } 
      }) 
     } 
    }) 

    alert.addAction(sendAction) 
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
    present(alert, animated: true, completion: nil) 

} 

У меня есть этот обратный вызов в ад, я хочу знать,Уплотненных обратного вызов сильных опорного цикл

  1. ли [weak self] & guard let strongSelf в самых верхней части обратного вызова ад предотвратить сильный опорный цикл всего через НОД-х асинхронный обратный вызов. Я читал некоторые другие должности на здесь, также одна из книги, который сказал, если объект я имею в виду внутри обратного вызова может deinit успешно, это означает, что хороший знак, не имея сильный опорный цикла, это все еще верно?

  2. Как предотвратить такой обратный вызов, можете ли вы привести меня к некоторым материалам или темам, которые я пропустил? синтаксис синтаксиса обещаний javascript?

ответ

1

Насколько я вижу, нет цикла удержания и, следовательно, нет необходимости ослаблять self. Вы, конечно, можете сделать это в каждом блоке, чтобы защищаться.

Цикл удержания отсутствует, поскольку экземпляр (self) не имеет ссылки на какое-либо закрытие. Особенно это касается sendAction, так как sendAction объявлен внутри функции sendSweet.

class MyView: UIView { 
    let str = "some variable to have somsthing to use self with" 

    func foo() { 
     let ba = { 
      // no problem. The instance of MyView (self) does not hold a (strong) reference to ba 
      self.str.trimmingCharacters(in: CharacterSet.alphanumerics) 
     } 

     ba() 
    } 
} 

Если бы двигаться let sendAction = ... вне функции как свойство экземпляра, вы бы иметь ссылочный цикл, хотя. В этом случае экземпляр (self) будет иметь сильную refrence к sendAction и sendAction закрытие будет иметь сильную ссылку на экземпляр (self):

< самоуправления -> {я. ...} aka sendAction.

class MyView: UIView { 
    let str = "asd" 
    // Problem. 
    // The instance of MyView (self) does hold a (strong) reference to ba ... 
    let ba:() -> Void 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     ba = {  
      // ... while ba holds a strong reference to the instance (self)   
      self.str.trimmingCharacters(in: CharacterSet.alphanumerics) 
     } 
    } 

    func foo() { 
     ba() 
    } 
} 

В этом случае вы должны разорвать цикл, weak ifying self внутри крышки, как вы это сделали.


Как предотвратить такого рода обратного вызова ад, вы можете привести меня в какой-то материал для чтения

Checkout DispatchGroup с.

(Apple Documentation)

+0

это напоминает еще один пост в блоге я читал, только ссылочный цикл происходят, когда вы пытаетесь ссылаться в двух направлениях в иерархии объектов, но не в одном направлении –

+0

То есть определение «цикл». – shallowThought

0

Найдено довольно изящное решение моей проблемы # 2

https://github.com/duemunk/Async

Пример фрагмента кода:

Async.userInitiated { 
    return 10 
}.background { 
    return "Score: \($0)" 
}.main { 
    label.text = $0 
}