【发布时间】:2020-02-26 14:49:45
【问题描述】:
我正在创建一个联系人类来异步获取用户的电话号码。
我利用新的 Combine 框架的 Future 创建了 3 个函数。
func checkContactsAccess() -> Future<Bool, Never> {
Future { resolve in
let authorizationStatus = CNContactStore.authorizationStatus(for: .contacts)
switch authorizationStatus {
case .authorized:
return resolve(.success(true))
default:
return resolve(.success(false))
}
}
}
func requestAccess() -> Future<Bool, Error> {
Future { resolve in
CNContactStore().requestAccess(for: .contacts) { (access, error) in
guard error == nil else {
return resolve(.failure(error!))
}
return resolve(.success(access))
}
}
}
func fetchContacts() -> Future<[String], Error> {
Future { resolve in
let contactStore = CNContactStore()
let keysToFetch = [
CNContactFormatter.descriptorForRequiredKeys(for: .fullName),
CNContactPhoneNumbersKey,
CNContactEmailAddressesKey,
CNContactThumbnailImageDataKey] as [Any]
var allContainers: [CNContainer] = []
do {
allContainers = try contactStore.containers(matching: nil)
} catch {
return resolve(.failure(error))
}
var results: [CNContact] = []
for container in allContainers {
let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier)
do {
let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as! [CNKeyDescriptor])
results.append(contentsOf: containerResults)
} catch {
return resolve(.failure(error))
}
}
var phoneNumbers: [String] = []
for contact in results {
for phoneNumber in contact.phoneNumbers {
phoneNumbers.append(phoneNumber.value.stringValue.replacingOccurrences(of: " ", with: ""))
}
}
return resolve(.success(phoneNumbers))
}
}
现在如何将这 3 个 Future 组合成一个 Future?
1) 检查权限是否可用
2) 如果为 true 则异步 fetchContacts
3) 如果为 false requestAccess 异步则 fetchContacts 异步
也欢迎任何有关如何更好地处理此问题的提示或技巧
func getPhoneNumbers() -> Future<[String], Error> {
...
}
【问题讨论】:
-
请显示实际代码,而不是三个省略号。
-
我用实际代码更新了@matt
-
你应该打电话给
resolve。不要返回调用它的“结果”。到处删除return。 -
您的授权状态代码也是错误的。然后您继续请求授权的唯一情况是
.notDetermined,但您没有区分这种情况。 -
同样调用
authorizationStatus(for:)不是异步的,因此没有必要从中创建 Future。
标签: swift asynchronous async-await combine