【问题标题】:Adding friends from address book using Parse使用 Parse 从通讯录中添加朋友
【发布时间】:2015-08-06 00:44:11
【问题描述】:

我正在构建一个应用程序,在注册/登录时,它将通过用户通讯录,获取电话号码,检查 Parse 上 User 类中的电话号码列,如果他们不是朋友,然后添加它们。

我在 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)
    }

}

最后,当点击按钮时,我将用户添加为朋友,如果还不是朋友的话:

@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)")
        }

    }

}

我这样做是否正确?它有效,但代码似乎有点长。有没有更简单的方法来做到这一点?

提前致谢

【问题讨论】:

    标签: ios swift parse-platform addressbook relation


    【解决方案1】:

    你应该看看 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() 在一个查询中创建所有关注关系,该方法需要保存一组 PFObjects。

    【讨论】:

    • 改用这个有帮助吗? static func lookUpUserFromAddressBook(addressBook: [String], completionBlock: PFArrayResultBlock) { let query = User.query() query!.whereKey("telephone", containsIn: addressBook) query!.findObjectsInBackgroundWithBlock(completionBlock) }
    • 是的,这会有所帮助。
    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多