@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)
}
私はこのコールバック地獄を持って、私はネストされたコールバックの強い基準サイクル
コールバック地獄の最上部にある
[weak self]
&guard let strongSelf
はGCDのを介してすべての強い参照サイクルを防ぐん知りたいです非同期コールバック。私は、コールバックの中で参照するオブジェクトがdeinit
であれば正常に参照することができますが、それは強い参照サイクルを持たないための良い兆候を意味しています、それはまだ本当ですか?この種のコールバックを防ぐにはどうすればいいですか?私が見逃してしまった資料やトピックに私を導くことができますか? javascriptの約束の連鎖構文のようなものは何ですか?
この、基準周期のみを私が読ん別のブログ記事を思い出させますオブジェクトの階層で2つの方向で参照しようとしたときに発生しますが、一方向では参照しません。 –
「サイクル」の定義。 – shallowThought