[Swift] [Parse] 일대다 관계에서 데이터 추출(Xcode6beta5,Parse.com)

17301 단어 XcodeParseSwift

A. 개요

  • mBaaS의Parse를 사용하여 표 간의 관계를 맺는다
  • 이번에 사용자와 트위터를 일대다 관계를 맺고 해당 사용자의 트위터만 추출
  • 추출된 데이터가 UItableView
  • 에 표시됩니다.
    [참고] ViewController가 VC로 표시됩니다.

    1. 사용자를 foreignkey로 Tweet 게시


    먼저 스토리보드와 코코아 터치 클래스에 트윗의 VC를 게시한다.swift라는 파일을 만듭니다.
    다음은 스토리보드에 텍스필드와 버튼을 준비하고 투고할 수 있는 형식을 준비한다.
    CompooseVC는 위의 두 가지 사항을 완료한 후swift에 다음 함수를 추가합니다.
    ComposeViewController.swift
    
        @IBOutlet var tweetTextView: UITextView! = UITextView()
    
        @IBAction func sendTweet(sender: AnyObject) {
            // classの作成。特にmigrationとかを書けなくても下記の一行でテーブルが作成されます。
            var tweet:PFObject = PFObject(className: "Tweets")
    
            // 生成するデータ
            tweet["content"] = tweetTextView.text
            tweet["tweeter"] = PFUser.currentUser()
    
            tweet.saveInBackground()
    
            self.navigationController.popToRootViewControllerAnimated(true)
    
        } 
    
    이렇게 하면 conntent와 Twitter라는 열이 생성됩니다.(두 번째 이후에는 데이터가 존재하는 열에 들어간다.)
    이 열에foreignkey로 현재 사용자의 ObjectId를 삽입합니다.이 정도면 됐어.
    그리고 스토리보드에서 @IBOutlet로 끌어 동작을 연결시킨다.

    2. 현재 사용자의 Tweet을 TableView로 표시


    먼저 스토리보드에 TableVC를 제작하고 다음 두 개의 파일을 동시에 제작한다.(Cocoa touch class 선택)
  • MyTimelineTableVC.swift(UITableVC)
  • MyTweetTableViewCell.swift(UITableViewCell)
  • 파일을 제작한 후 스토리보드에서 VC의 Class를 My Timeline Table VC로 변경하고, Cell의 Class를 My Tweet Table View Cell로 변경합니다.
    (Cell의 클래스는 스토리보드 왼쪽 하단의 Doctument Outline에서 시작됩니다.)

    다음은 MyTweetTableViewCell 입니다.swift를 편집합니다.
    MyTweetTableViewCell.swift
    import UIKit
    
    class MyTweetTableViewCell: UITableViewCell {
    
        // ストーリーボードでtextViewを追加しておいて、下記のIBOutletとひもづける
        @IBOutlet weak var tweetTextView: UITextView! = UITextView()
    
        required override convenience init(style: UITableViewCellStyle, reuseIdentifier: String) {
            self.init(style: style, reuseIdentifier: reuseIdentifier)
            // Initialization code
        }
    
        override func awakeFromNib() {
            super.awakeFromNib()
            // Initialization code
        }
    
        override func setSelected(selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
    
            // Configure the view for the selected state
        }
    
    }
    
    다음은 My Timeline TableV입니다.swift를 편집합니다.
    MyTlimelineTableVC.swift
    import UIKit
    
    class MyTimelineTableViewController: UITableViewController {
    
        var timelineData:NSMutableArray = NSMutableArray()
    
    
        required init(coder aDecoder: NSCoder!) {
            super.init(coder: aDecoder)
        }
    
        func loadData(){
            timelineData.removeAllObjects()
    
            // Tweetsテーブルを参照
            var findCurrentUserTweets:PFQuery = PFQuery(className: "Tweets")
            // Tweetsテーブルのtweeterカラムから現在のユーザーのobjectidと一致するデータを抽出
            findCurrentUserTweets.whereKey("tweeter", equalTo: PFUser.currentUser())
    
            findCurrentUserTweets.findObjectsInBackgroundWithBlock{
                (objects:[AnyObject]!, error:NSError!)->Void in
    
                if !error{
                    for object in objects{
                        self.timelineData.addObject(object)
                    }
    
                    let array:NSArray = self.timelineData.reverseObjectEnumerator().allObjects
                    self.timelineData = array as NSMutableArray
    
                    self.tableView.reloadData()
                }
            }
        }
    
        override func viewDidAppear(animated: Bool) {
    
            self.loadData()
    
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Uncomment the following line to preserve selection between presentations
            // self.clearsSelectionOnViewWillAppear = false
    
            // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
            // self.navigationItem.rightBarButtonItem = self.editButtonItem()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        // MARK: - Table view data source
    
        override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
            // #warning Potentially incomplete method implementation.
            // Return the number of sections.
            return 1
        }
    
        override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
            // #warning Incomplete method implementation.
            // Return the number of rows in the section.
            // データの数だけrowを返す
            return timelineData.count
        }
    
    
        override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
            let cell:MyTweetTableViewCell = tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as MyTweetTableViewCell
    
            let tweet:PFObject = self.timelineData.objectAtIndex(indexPath!.row) as PFObject
    
            cell.tweetTextView.text = tweet.objectForKey("content") as String
    
            return cell
        }
    }
    
    관계식을 사용하는 섹션에는 다음 두 줄만 있습니다.
    MyTimelineTableVC.swift
            // Tweetsテーブルを参照
            var findCurrentUserTweets:PFQuery = PFQuery(className: "Tweets")
            // Tweetsテーブルのtweeterカラムから現在のユーザーのobjectidと一致するデータを抽出
            findCurrentUserTweets.whereKey("tweeter", equalTo: PFUser.currentUser())
    
    이렇게 되면 일반적인 시간선에서 모든 사용자의 데이터를 재생할 수 있다
    내 페이지에는 자신의 타임라인만 재생되었다.
    (통상적인 타임라인에 대해서는 과거 기사를 참조하세요)
  • 일반 타임라인
  • 내 페이지 타임라인
  • 3. 과거 관련 기사

  • http://qiita.com/kiiita/items/bc62293f6c4d479993c1
  • http://qiita.com/kiiita/items/1a1358437bb702a0af95
  • 좋은 웹페이지 즐겨찾기