Удалить дубликаты элементов из основного массива данных - PullRequest
0 голосов
/ 07 февраля 2019

Я храню данные своих контактов в основном объекте данных, и я пытаюсь получить эти данные в массиве этого объекта и заполнить данные в моем табличном представлении, теперь, когда я получаю эти данные, я получаю дублирующиеся данные.Как можно удалить мои дубликаты данных из массива моего основного объекта данных.Это код, как я получаю данные от объекта,

 func getAllContacts()
{
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Contacts")
    request.returnsObjectsAsFaults = false
    do {
        let result = try context.fetch(request)

        allContacts = result as! [Contacts]

        for contact in allContacts
        {
            let register = contact.register
            if register == "yes"
            {
                self.contactsCoreDataRavenNameArray.append(contact.name!)
                self.contactsCoreDataRavenNumberArray.append(contact.number!)
                self.contactsCoreDataRavenImageArray.append(contact.image!)
            }
            else {

                self.contactsCoreDataNonRavenNameArray.append(contact.name!)
                self.contactsCoreDataNonRavenNumberArray.append(contact.number!)
                self.contactsCoreDataNonRavenImageArray.append(contact.image!)
            }
            contactsCoreDataNameServer.append(contact.name!)
            contactsCoreDataNumberServer.append(contact.number!)
            contactsCoreDataImageServer.append(contact.image!)
        }

    } catch {

        print("Failed")
    }
}

Вот как я храню данные ответов API в моем основном объекте данных,

func compareWithRavenServerContacts(_ refreshing: Bool) {

    if let token = LoginToken {
        let param = [
            "token" : token,
            "contacts" : numberArrayForServer,
            "names" : namesArrayForServer
            ] as [String : Any]

        print(param)
        if refreshing {
            DispatchQueue.main.async {
            topViewController()?.view.makeToastActivity(.center)
            }
        }

        ServerCall.makeCallWitoutFile(GetRavenContactsUrl, params: param, type: Method.POST, currentView: nil) { (response) in

            if let json = response {
                print(json)
                if json["success"].boolValue {
                    let data = json["data"].arrayValue
                    print(data.count,data)
                    var ravenContacts = [ContactStruct]()
                    var serverContacts = [ContactStruct]()
                    var NonRavenContacts = [ContactStruct]()

                    for item in data
                    {
                        let name = item["name"].stringValue
                        let phone = item["phone"].stringValue
                        let picture = item["picture"].stringValue
                        let register = item["is_register"].stringValue

                        let optData = try? self.updateContact(name: name, number: phone)
                        guard let data1 = optData else {
                            return
                        }
                        print(data1)

                        let appDelegate = UIApplication.shared.delegate as? AppDelegate
                        let context = appDelegate?.persistentContainer.viewContext
                        let entity = NSEntityDescription.entity(forEntityName: "Contacts", in: context!)
                        let user = NSManagedObject(entity: entity!, insertInto: context)

                        user.setValue(name, forKey: "name")
                        user.setValue(phone, forKey: "number")
                        user.setValue(register, forKey: "register")
                        user.setValue(picture, forKey: "image")

                        do {
                            try context?.save()
                            print("Saved successfully.")

                        } catch  {
                            print("Fail to save")
                        }

                        let contact = ContactStruct(name: name, number: phone, register: register, profilePic: picture, isSelected: false)

                        if register == "yes" {
                            ravenContacts.append(contact)
                        } else {
                            NonRavenContacts.append(contact)
                        }
                        serverContacts.append(contact)
                    }

                    self.contactsRaven = ravenContacts.sorted(by: { ($0.name < $1.name) })

                    self.contactsServer = serverContacts.sorted(by: { ($0.name < $1.name) })

                    self.contactsNonRaven = NonRavenContacts.sorted(by: { ($0.name < $1.name) })

                    self.getAllContacts()

                    self.contactsDevice = self.contactsServer

                    topViewController()?.view.hideToastActivity()
                }
                else
                {
                    topViewController()?.view.makeToast("Error!. Please try again", duration: 2.0, position: .center)
                    topViewController()?.view.hideToastActivity()
                }
            }
        }
    }
    else {
        DispatchQueue.main.async {
            topViewController()?.view.makeToast("Error!, Login Again To Call Services", duration: 2.0, position: .center)
            topViewController()?.view.hideToastActivity()
        }
    }
}

1 Ответ

0 голосов
/ 07 февраля 2019

Так что, если contact.name и contact.number оба являются строками, легко удалить дубликаты.Вам просто нужно вызвать это:

let noDuplicatesNameArray = Array(Set(exampleNameArray))

Я предполагаю, что contact.image - это UIImage.Это немного сложнее.Лучшим, самым чистым решением было бы сохранить имена UIImages в строковом массиве и проверить их на наличие дубликатов, а затем создать из них новый массив изображений.

Если вы не можете сделать это по какой-то причине, яразработал решение для вас, где вы можете проверить массив UIImages для дубликатов.Обратите внимание, что я только что разработал этот код.Некоторые люди могут найти это бесхитростным.Если вы тоже находите это несложным, пожалуйста, ищите SO для более оптимальных ответов.

Таким образом, у вас есть массив UIImages:

var imagesArray = [UIImage(named: "image1"), UIImage(named: "image1"), UIImage(named: "image1"), UIImage(named: "image2")]

Вы создаете новый массив, в котором вы сохраняете неповторяющиесяimages:

var newImagesArray = [UIImage]()

Эта функция очищает массив от дубликатов:

    func clearDuplicates() {
    var set = Set<Data>()

    for image in imagesArray {
        let data = image?.pngData()
        set.insert(data!)
    }

    let noDuplicateArray = Array(set)

    for imgData in noDuplicateArray {
        let image = UIImage(data: imgData)
        newImagesArray.append(image!)
    }
    print("You have an array of UIImages with no duplicates!")
}

Теперь newImagesArray - это imagesArray, но без дубликатов.Дайте мне знать, если это поможет!

Для получения дополнительной информации об удалении дубликатов из массивов см. этот SO ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...