我正在构建一个应用程序,并且在注册/登录时,它将通过用户通讯录,获取电话号码,对照Parse的User类中的电话号码列进行检查,如果他们不是 friend ,则添加它们。
我在AddressBookHelper.swift中有一个函数来帮助获取电话号码:
class AddressBookHelper: NSObject {
let addressBook = AFAddressBookManager()
static var addressBookData = AFAddressBookManager.allContactsFromAddressBook()
static var contactsArray = [String]()
static func getContacts() -> [String] {
var array = [String]()
for contact in addressBookData{
let phoneNumberArray = contact.numbers as! [String]
for number in phoneNumberArray{
array.append(number)
}
}
return array
}
}
然后在ParseHelper.swift中,再次检查Parse User类:
static func lookUpUserFromAddressBook(addressBook: [String], completionBlock: PFArrayResultBlock) {
for numbers in addressBook{
let query = User.query()
query!.whereKey("telephone", equalTo:numbers)
query!.findObjectsInBackgroundWithBlock(completionBlock)
}
}
最后,当单击按钮时,我将该用户添加为 friend (如果还不是 friend ):
@IBAction func importContacts(sender: AnyObject) {
ParseHelper.lookUpUserFromAddressBook(AddressBookHelper.getContacts()) {
(results: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
if let objects = results as? [PFObject] {
for object in objects {
let userObject = object as! User
self.matchedUsers.append(userObject)
let query = PFQuery(className: "Friends")
query.includeKey("toUser")
query.whereKey("fromUser", equalTo: User.currentUser()!)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
if (objects!.count == 0) {
ParseHelper.addFollowRelationshipFromUser(fromUser: User.currentUser()!, toUser: userObject, completionBlock: { (success, error) -> Void in
if success{
self.performSegueWithIdentifier("skipped", sender: self)
}
else{
print("Error: \(error!) \(error!.userInfo)")
}
})
}
else{
self.performSegueWithIdentifier("skipped", sender: self)
}
} else {
print("Error: \(error) \(error!.userInfo)")
}
}
}
}
}
else {
print("Error: \(error!) \(error!.userInfo)")
}
}
}
我这样做正确吗?它可以工作,但是代码似乎有点长。有没有更简单的方法可以做到这一点?
提前致谢
最佳答案
您应该看一下PFQuery的whereKey:containedIn:
。这将向您返回所有用户的电话列表,这些用户的电话号码与您在数组中传递的任何号码均匹配。这将大大减少检索用户联系人所需的查询数量。
// Find users with any of these phone numbers
let numbers = ["1234567890", "1111111111", "222222222"]
query.whereKey("phoneNumber", containedIn: numbers)
从Parse iOS开发人员指南中:
https://parse.com/docs/ios/guide#queries
如果要检索与几个不同值匹配的对象,则可以
可以使用whereKey:containedIn :,提供可接受的数组
价值观。这对于用单个查询替换多个查询通常很有用
查询。
您也可以使用PFObject.saveAllInBackground()在一个查询中创建所有跟随关系,该查询需要保存一组PFObject。
关于ios - 使用Parse从通讯录添加 friend ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31845058/