J'essaie de déclarer une propriété calculée constituée d'un bloc, exécutée dans le thread d'arrière-plan. Donc, quand j'adresse cette propriété, c'est nul, car le calcul retourne le résultat quand il n'est pas prêt. Comment mieux corriger cela? Je vous remercie!Comment déclarer correctement une propriété calculée, lorsque le calcul utilise des threads d'arrière-plan?
enum Result<T> {
case error(error: Error)
case success(data: T)
}
var userID: Result<CKRecordID>? {
var result: Result<CKRecordID>? = nil
container.fetchUserRecordID { recordID, error in
if let error = error { result = .error(error: error) }
if let recordID = recordID { result = .success(data: recordID) }
}
return result
}
Ne pourriez-vous pas utiliser une fermeture à la place? Donc, quand l'utilisateur récupère, il exécute une fermeture completed() et retourne l'identifiant d'enregistrement? – arvidurs
Vous ne pouvez pas renvoyer de manière asynchrone une valeur d'une propriété. –
Théoriquement, vous pouvez appliquer des modèles pour faire attendre la réponse, mais l'idée générale des mécanismes de récupération asynchrone est de s'assurer que vous ne bloquez pas le thread principal qui attend une réponse. Donc, la réponse courte est que vous ne devriez vraiment pas utiliser la propriété calculée pour envelopper une méthode asynchrone. Il suffit de coller avec 'fetchUserRecordID'. Si vous voulez l'inclure dans une méthode qui renvoie votre type 'Result' dans une fermeture de gestionnaire d'achèvement, c'est bien, mais n'essayez pas de faire avec une propriété calculée. –
Rob