2016-10-12 9 views
0

私はソーシャルメディアアプリを作っています。データモデルを変更するにはどうすればよいですか?

ユーザー - のDisplayName - profileImg - - をユーザ名、パスワード - メール

コメント - コメント - - をユーザ名フォロワー -

友人 に - 以下に続く

ハッシュタグ - ハッシュタグ - へ - によって - コメント

が好き - に - postImg - - ユーザ名 - タイトル

投稿 で - uuid

私の質問のユーザーが その後、タイトルテキストと画像を投稿したときに、私は、ユーザー名を取得したいされ、profileImg、タイトル、コメント、commentby、postImg、同類のカウント

私のアプローチは

dbの投稿を再設計であります

ポスト - postImg - をユーザ名 - タイトル - UUID - コメント - commentby - profileImg - コあなたの好きなもの

しかし、私はdbのデザインが悪いと思う。

func loadPosts() { 

     //STEP 1. Find posts related to people who we are following 

     let followQuery = PFQuery(className: “friends") 

     followQuery.whereKey(“following", equalTo: PFUser.current()!.username!) 
     followQuery.findObjectsInBackground (block: { (objects:[PFObject]?, error:Error?) -> Void in 

      if error == nil { 
       //clean up 
       self.followArray.removeAll(keepingCapacity: false) 

       //Appending where people following.. 
       //find related objects 
       for object in objects! { 
        self.followArray.append(object.object(forKey: “following") as! String) 
       } 
       //append current user to see own posts in feed 
       self.followArray.append(PFUser.current()!.username!) 


       //STEP 2. Find posts made by people appended to followArray 
       let query = PFQuery(className: "posts") 
       query.whereKey("username", containedIn: self.followArray) 
       query.limit = self.page 
       query.addDescendingOrder("createdAt") 


       query.findObjectsInBackground(block: { (objects:[PFObject]?, error:Error?) -> Void in 

        if error == nil { 

         //clean up 
         self.usernameArray.removeAll(keepingCapacity: false) 
//      self.profileArray.removeAll(keepCapacity: false) 
         self.dateArray.removeAll(keepingCapacity: false) 
         self.postArray.removeAll(keepingCapacity: false) 
         self.descriptionArray.removeAll(keepingCapacity: false) 

         self.uuidArray.removeAll(keepingCapacity: false) 
         self.commentsArray.removeAll(keepingCapacity: false) 
         self.commentsByArray.removeAll(keepingCapacity: false) 

         //find related objects 
         for object in objects! { 
          self.usernameArray.append(object.object(forKey: "username") as! String) 
//       self.profileArray.append(object.objectForKey("profileImg") as! PFFile) 
          self.dateArray.append(object.createdAt) 
          self.postArray.append(object.object(forKey: "postImg") as! PFFile) 
          self.descriptionArray.append(object.object(forKey: "title") as! String) 
          self.uuidArray.append(object.object(forKey: "uuid") as! String) 

          //set Comments 
          let comment = object.object(forKey: "comment") as! String 
          let by = object.object(forKey: "commentby") as! String 
          let commentString = " " + comment 

          self.commentsByArray.append(by) 
          self.commentsArray.append(commentString) 


         } 
         //reload tableView & end spinning of refresher 
         self.tableView.reloadData() 
         self.refresher.endRefreshing() 

        } else { 
         print(error!.localizedDescription) 
        } 
       }) 


      } else { 
       print(error!.localizedDescription) 
      } 

     }) 

    } 

定義されたセル

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


//define cell 
let cell = tableView.dequeueReusableCell(withIdentifier: "ShopDetailCell", for: indexPath) as! ShopDetailCell 



cell.userNameLabel.text = usernameArray[(indexPath as NSIndexPath).row - 1] 
cell.userNameLabel.sizeToFit() 

cell.uuidLabel.text = uuidArray[(indexPath as NSIndexPath).row - 1] 

cell.descriptionLabel.text = descriptionArray[indexPath.row - 1] 
cell.descriptionLabel.sizeToFit() 



cell.commentLabel.sizeToFit() 


//Load ProfileImage 
let profileImgQuery = PFQuery(className: "_User") 
profileImgQuery.whereKey("username", equalTo: usernameArray[(indexPath as NSIndexPath).row - 1]) 
profileImgQuery.findObjectsInBackground(block: {(objects:[PFObject]?, error:Error?) -> Void in 

    if error == nil { 

     //shown wrong user 
     if objects!.isEmpty { 
      print("Wrong User") 
     } 

     //find related to user information 
     for object in objects! { 

      //Set Image 
      let profilePictureObject = object.object(forKey: "profileImg") as? PFFile 
      profilePictureObject?.getDataInBackground { (imageData:Data?, error:Error?) -> Void in 

       if(imageData != nil) 
       { 
        let profileURL : URL = URL(string: profilePictureObject!.url!)! 

        cell.userImg.sd_setImage(with: profileURL, placeholderImage: UIImage(named: "holderImg")) 
       } 

      } 

     } 
    } else { 
     print(error?.localizedDescription) 
    } 

}) 

//Clip to circle 
cell.userImg.layoutIfNeeded() 
cell.userImg.layer.cornerRadius = cell.userImg.frame.size.width/2 
cell.userImg.clipsToBounds = true 



// place post picture using the sdwebimage 
let postURL : URL = URL(string: postArray[(indexPath as NSIndexPath).row - 1].url!)! 
cell.postImg.sd_setImage(with: postURL, placeholderImage: UIImage(named: "holderImg")) 


//Calculate post date 
let from = dateArray[(indexPath as NSIndexPath).row - 1] 
let now = Date() 

let components : NSCalendar.Unit = [.second, .minute, .hour, .day, .weekOfMonth] 

let difference = (Calendar.current as NSCalendar).components(components, from: from!, to: now, options: []) 



// logic what to show : Seconds, minutes, hours, days, or weeks 
if difference.second! <= 0 { 
    cell.dateLabel.text = "NOW" 
} 

if difference.second! > 0 && difference.minute! == 0 { 

    cell.dateLabel.text = "\(difference.second!) SEC AGO" 
} 

if difference.minute! > 0 && difference.hour! == 0 { 

    cell.dateLabel.text = "\(difference.minute!) MIN AGO" 
} 

if difference.hour! > 0 && difference.day! == 0 { 
    cell.dateLabel.text = "\(difference.hour!) HR AGO" 

} 

if difference.day! > 0 && difference.weekOfMonth! == 0 { 

    cell.dateLabel.text = "\(difference.day!) DAY AGO" 
} 

if difference.weekOfMonth! > 0 { 
    cell.dateLabel.text = "\(difference.weekOfMonth!) WEEK AGO" 
} 
cell.dateLabel.sizeToFit() 


//Set Text Label 
if cell.descriptionLabel.text!.isEmpty == true || cell.descriptionLabel.text == " "{ 
    if cell.commentLabel.text!.isEmpty == true || cell.commentLabel.text == " "{ 
     cell.dateTop.constant = 7 
    }else { 
     cell.dateTop.constant = cell.commentTop.constant + cell.commentLabel.frame.height + 8 
    } 
}else { 
    if cell.commentLabel.text!.isEmpty == true || cell.commentLabel.text == " "{ 
     cell.dateTop.constant = cell.descriptionTop.constant + cell.descriptionLabel.frame.height + 8 
    }else { 
     cell.commentTop.constant = cell.descriptionTop.constant + cell.descriptionLabel.frame.height + 8 
     cell.dateTop.constant = cell.commentTop.constant + cell.commentLabel.frame.height + 8 
    } 
} 

// manipulate like button depending on did user like it or not 
let didLike = PFQuery(className: "likes") 
didLike.whereKey("by", equalTo: PFUser.current()!.username!) 
didLike.whereKey("to", equalTo: cell.uuidLabel.text!) 
didLike.countObjectsInBackground(block: {(count:Int32, error:Error?) -> Void in 

    //if no any likes are found, else found likes 
    if count==0 { 

     cell.likeBtn.setTitle("unlike", for: UIControlState()) 
     cell.likeBtn.setImage(UIImage(named:"heartBtn"), for: UIControlState()) 
    }else{ 

     cell.likeBtn.setTitle("like", for: UIControlState()) 
     cell.likeBtn.setImage(UIImage(named: "heartTapBtn"), for: UIControlState()) 

    } 

}) 

//count total likes of shown post 
let countLikes = PFQuery(className: "likes") 
countLikes.whereKey("to", equalTo: cell.uuidLabel.text!) 
countLikes.countObjectsInBackground(block: {(count:Int32, error:Error?) -> Void in 

    cell.likesLabel.text="\(count) likes" 
}) 



cell.userNameLabel.layer.setValue(indexPath, forKey: "index") 
cell.commentBtn.layer.setValue(indexPath, forKey: "index") 
cell.moreBtn.layer.setValue(indexPath, forKey: "index") 




return cell 

}

あなたは誰を私に助言てもらえますか?

私はこのチュートリアル「https://parse.com/tutorials/anypic」を読んでいたが、私は私、私は参加したり、ポインタの方法の使用したい

ための優れているデータモデルを決定することはできません。

+0

このチュートリアルが見つかりました。このデータモデルは私のデータモデルより優れていますか?もし誰かがそれが良いと、なぜ、私に教えてください?ありがとうございますhttps://parse.com/tutorials/anypic –

答えて

1

ユーザーが投稿を行うたびに、投稿クラスにポインタとしてcurrentUserを保存することができます。

注:私はObjective-Cでデモンストレーションしますが、Swiftに翻訳するのはとても簡単です。しかし、objcコードの読み込みに問題がある場合は、Swiftバージョンへの回答を編集します。

func post { //make a post 
    var post = PFObject(className:"Posts") 
    post["user"] = PFUser.current()//save the current user as a pointer pointing to the User class. You can add a column of type pointer in your parse dashboard inside your Posts class. 
    //set up other attributes here... 
    post.saveInBackground() 
} 

我々は、クエリを実行するときに、我々は、ユーザポインタを含めるようにincludeKeyを使用することができます。

let query = PFQuery(className: "posts") 
query.whereKey("username", containedIn: self.followArray) 
query.includeKey("user")// THIS IS IMPORTANT 
query.limit = self.page 
query.addDescendingOrder("createdAt") 
query.findObjectsInBackground(block: { (objects:[PFObject]?, error:Error?) -> Void in 
    if !error { 
     //we can access the user pointer by doing: 
     for object in objects { 
      var user = object["user"] 
      var username = user.username 
      var profileImage = user["profileImg"] //a PFFile 
      //... 
     } 
    } 

手動でクエリ結果を格納する必要はありませんので、また、あなたは常に、あなたのためのオブジェクトをロードするためにPFQueryTableViewControllerを使用することができます。

+0

返信いただきありがとうございます。 :)素早く書き直せますか?私はそれを試してみます1-2日待ってください。 –

関連する問題