title: Swift: How to remove duplicates from my table view?
body: <p>Problem here is that I'm getting duplicates in my table view and I know why but I don't know how to fix it and implement a different system.</p>
  
  <p>My app is a blog reader that reads from a MYSQL database using PHP to send JSON to my Swift app. My table view has two sections, one for all the objects from the database and second section is for when I click the follow button on the cells, basically move the objects from mainArray to followedArray. Each section is using an array so for example I move all the objects from mainArray to followedArray and I update the table I get all those objects again in mainArray, obviously because the mainarray is empty and the code is just doing its job.</p>
  
  <p>So how can I implement a better system so when the user moves the objects from one section to another (or from mainArray to followedArray) mainArray doesn't get repopulated with the same objects that it had and are now in followedArray.</p>
  
  <p>Here is the code I use.</p>
  
  <p>MainController.swift - Class where Tableview is at</p>
  
  <pre><code>var mainArray = [Blog]()
  var followedArray = [Blog]()
  
  // Title for Header
  func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -&gt; String? {
  
      if !(searchController.isActive &amp;&amp; searchController.searchBar.text != "") {
  
          if section == 0 {
              return "Followed Blogs"
          }
          else {
              return "All Blogs"
          }
      }
      return "Filtered Blogs"
  }
  
  // Number of Rows in Section
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
  
      if !(searchController.isActive &amp;&amp; searchController.searchBar.text != "") {
  
          if section == 0 {
  
              return followedArray.count
          }
          else if (section == 1) {
  
              return mainArray.count
          }
      }
      return filteredArray.count
  }
  
  // CellForRowAt indexPath
  public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
  
      let CellIdentifier = "Cell"
      var cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier) as! CustomCell
  
      if cell != cell {
          cell = CustomCell(style: UITableViewCellStyle.default, reuseIdentifier: CellIdentifier)
      }
  
      // Configuring the cell
      var blogObject: Blog
  
      if !(searchController.isActive &amp;&amp; searchController.searchBar.text != "") {
          if indexPath.section == 0 {
              blogObject = followedArray[indexPath.row] 
              cell.populateCell(blogObject, isFollowed: true, indexPath: indexPath, parentView: self)
          }
          else if indexPath.section == 1 {
              blogObject = mainArray[indexPath.row] 
              cell.populateCell(blogObject, isFollowed: false, indexPath: indexPath, parentView: self)
          }
      }
      else {
          blogObject = filteredArray[indexPath.row] 
          cell.populateCell(blogObject, isFollowed: false, indexPath: indexPath, parentView: self)
      }
  
      return cell
  }
  
  // Follow Button
  @IBAction func followButtonClick(_ sender: UIButton!) {
  
      // Adding row to tag
      let buttonPosition = (sender as AnyObject).convert(CGPoint.zero, to: self.myTableView)
      if let indexPath = self.myTableView.indexPathForRow(at: buttonPosition) {
  
          // Showing Status Labels
          let cell = self.myTableView.cellForRow(at: indexPath) as! CustomCell
          cell.firstStatusLabel.isHidden = false
          cell.secondStatusLabel.isHidden = false
  
          // Change Follow to Following
          (sender as UIButton).setImage(UIImage(named: "follow.png")!, for: .normal)
          cell.followButton.isHidden = true
          cell.followedButton.isHidden = false
  
          // Checking wether to import from mainArray or filteredArray to followedArray
          if !(searchController.isActive &amp;&amp; searchController.searchBar.text != "") {
  
              self.myTableView.beginUpdates()
  
              // ----- Inserting Cell to followedArray -----
              followedArray.insert(mainArray[indexPath.row], at: 0)
              myTableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .fade)
  
              // ----- Removing Cell from mainArray -----
              mainArray.remove(at: indexPath.row)
              let rowToRemove = indexPath.row
              self.myTableView.deleteRows(at: [IndexPath(row: rowToRemove, section: 1)], with: .fade)
  
              self.myTableView.endUpdates()
  
              myTableView.reloadData()
  
              // After Updating Table, Save the Archived to UserDefaults
              saveUserDefaults()
          }
          else {
  
              self.myTableView.beginUpdates()
  
              // ----- Inserting Cell to followedArray -----
              let blogObject: Blog = filteredArray[indexPath.row]
              let indexOfObjectInArray = mainArray.index(of: blogObject)
  
              followedArray.insert(blogObject, at: 0)
  
              // ----- Removing Cell from filteredArray -----
              filteredArray.remove(at: indexPath.row)
              mainArray.remove(at: indexOfObjectInArray!)
              let rowToRemove = indexPath.row
              self.myTableView.deleteRows(at: [IndexPath(row: rowToRemove, section: 0)], with: .fade)
  
              self.myTableView.endUpdates()
  
              myTableView.reloadData()
  
              // After Updating Table, Save the Archived to UserDefaults
              saveUserDefaults()
          }
      }
  }
  
  
  // Retrieving Data from Server
  func retrieveDataFromServer() {
  
      let getDataURL = "http://example.com/receiving.php"
      let url: NSURL = NSURL(string: getDataURL)!
  
      do {
          let data: Data = try Data(contentsOf: url as URL)
          let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSMutableArray
  
          // Looping through jsonArray
          for jsonObject in jsonArray {
  
              if let blog = Blog.createGame(from: jsonObject as AnyObject) {
  
                  mainArray.append(blog)
              }
          }
      }
      catch {
          print("Error: (Retrieving Data)")
      }
      myTableView.reloadData()
  }
  </code></pre>
  
  <p>Blog.swift - Handles the blogs objects where I user NSCoder too</p>
  
  <pre><code>import UIKit
  
  class Blog: NSObject, NSCoding {
  
  var blogName: String!
  var blogStatus1: String!
  var blogStatus2: String!
  var blogURL: String!
  var blogID: String!
  var blogType: String!
  var blogDate: String!
  var blogPop: String!
  
  static func createBlog(from jsonObject: AnyObject) -&gt; Blog? {
  
      guard let bID: String = jsonObject.object(forKey: "id") as? String,
          let bName: String = jsonObject.object(forKey: "blogName") as? String,
          let bStatus1: String = jsonObject.object(forKey: "blogStatus1") as? String,
          let bStatus2: String = jsonObject.object(forKey: "blogStatus2") as? String,
          let bURL: String = jsonObject.object(forKey: "blogURL") as? String,
          let bType: String = jsonObject.object(forKey: "blogType") as? String,
          let bDate: String = jsonObject.object(forKey: "blogDate") as? String,
          let bPop: String = jsonObject.object(forKey: "blogPop") as? String
  
          else {
            print("Error: (Creating Blog Object)")
            return nil
  }
  
  let blog = Blog()
      blog.blogName = bName
      blog.blogStatus1 = bStatus1
      blog.blogStatus2 = bStatus2
      blog.blogURL = bURL
      blog.blogID = bID
      blog.blogType = bType
      blog.blogDate = bDate
      blog.blogPop = bPop
      return blog
  }
  
  convenience required init?(coder aDecoder: NSCoder) {
      self.init ()
      self.blogName = aDecoder.decodeObject(forKey: "blogName") as! String
      self.blogStatus1 = aDecoder.decodeObject(forKey: "blogStatus1") as! String
      self.blogStatus2 = aDecoder.decodeObject(forKey: "blogStatus2") as! String
      self.blogURL = aDecoder.decodeObject(forKey: "blogURL") as! String
      self.blogID = aDecoder.decodeObject(forKey: "blogID") as! String
      self.blogType = aDecoder.decodeObject(forKey: "blogType") as! String
      self.blogDate = aDecoder.decodeObject(forKey: "blogDate") as! String
      self.blogPop = aDecoder.decodeObject(forKey: "blogPop") as! String
  }
  
  func encode(with aCoder: NSCoder) {
      aCoder.encode(blogName, forKey: "blogName")
      aCoder.encode(blogStatus1, forKey: "blogStatus1")
      aCoder.encode(blogStatus2, forKey: "blogStatus2")
      aCoder.encode(blogURL, forKey: "blogURL")
      aCoder.encode(blogID, forKey: "blogID")
      aCoder.encode(blogType, forKey: "blogType")
      aCoder.encode(blogDate, forKey: "blogDate")
      aCoder.encode(blogPop, forKey: "blogPop")
   }
  }
  </code></pre>
  
  <p>Is there a way to check before repopulating mainArray to see whats in followedArray and whatever is missing or added to the database to import and not create duplicates because new blogs will be added and the users will transfer blogs across sections so this is a major issue that I am having.</p>
  
  <p>Would appreciate the help as I am still learning Swift, thank you.</p>