Advertisement
Guest User

Untitled

a guest
Mar 13th, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 10.60 KB | None | 0 0
  1. //
  2. //  Database.swift
  3. //  SocialFriends
  4. //
  5. //  Created by Jógvan Olsen on 3/7/16.
  6. //  Copyright © 2016 Jógvan Olsen. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import CloudKit
  11.  
  12. class Database: NSObject {
  13.    
  14.     var db:CKDatabase
  15.    
  16.     override init(){
  17.         db = CKContainer.defaultContainer().publicCloudDatabase
  18.     }
  19.    
  20.     /* Posts functions */
  21.     func getFeed(user:User, comletionHander ch: (posts:[Post]) -> Void){
  22.         let startLoadingFeed = {
  23.             var allPosts:[Post] = []
  24.             var userCount = 0
  25.            
  26.             let userFeedLoaded:([Post])->Void = {
  27.                 posts in
  28.                 userCount--
  29.                 allPosts += posts
  30.                
  31.                 if userCount == 0{
  32.                     ch(posts: allPosts)
  33.                 }
  34.             }
  35.            
  36.             self.loadFeed(user.record, completionHandler: userFeedLoaded)
  37.             for friend in user.friends!{
  38.                 userCount++
  39.                 self.loadFeed(friend.record, completionHandler: userFeedLoaded)
  40.             }
  41.            
  42.         }
  43.        
  44.        
  45.         // Load friends first if not loaded.
  46.         if user.friends == nil{
  47.             loadFriends(user, completionHandler: startLoadingFeed)
  48.         } else {
  49.             startLoadingFeed()
  50.         }
  51.     }
  52.    
  53.     func loadFeed(userRecord: CKRecord, completionHandler ch: (posts: [Post]) -> Void){
  54.         let predicate = NSPredicate(format: "user == %@", CKReference(record: userRecord, action: .DeleteSelf))
  55.         let query = CKQuery(recordType: "post", predicate: predicate)
  56.        
  57.         db.performQuery(query, inZoneWithID: nil){
  58.             records, error in
  59.            
  60.             if error == nil{
  61.                 var posts:[Post] = []
  62.                
  63.                 var c = records!.count*2
  64.                 for record in records!{
  65.                     let user = record.objectForKey("user") as! CKReference
  66.                     let content = record.objectForKey("content") as! String
  67.                     let time = record.objectForKey("time") as! NSDate
  68.                    
  69.                     self.loadUser(user){
  70.                         user in
  71.  
  72.                         let post = Post(recordName: record, user: user!, content: content, time: time)
  73.                         posts.append(post)
  74.                        
  75.                         let f = {
  76.                             c--
  77.                             if c == 0{
  78.                                 ch(posts: posts)
  79.                             }
  80.                         }
  81.                        
  82.                         self.loadPostComments(post, completionHandler: f)
  83.                         self.loadPostLikes(post, completionHandler: f)
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.     }
  89.    
  90.     func loadPostComments(post: Post, completionHandler ch: () -> Void){
  91.         post.comments = []
  92.         let predicate = NSPredicate(format: "post == %@", CKReference(record: post.recordName, action: .DeleteSelf))
  93.         let query = CKQuery(recordType: "comment", predicate: predicate)
  94.  
  95.         db.performQuery(query, inZoneWithID: nil){
  96.             records, error in
  97.             if error == nil{
  98.                 var c = records!.count
  99.                 if c == 0 {
  100.                     ch()
  101.                 }
  102.                 for record in records!{
  103.                     let userReference = record.objectForKey("user") as! CKReference
  104.                     let content = record.objectForKey("content") as! String
  105.                     let time = record.objectForKey("time") as! NSDate
  106.                    
  107.                     self.loadUser(userReference){
  108.                         user in
  109.                         let comment = Comment(recordName: record, user: user!, post: post, content: content, time: time)
  110.                         self.loadCommentLikes(comment){
  111.                             post.comments!.append(comment)
  112.                             c--
  113.                             if c == 0{
  114.                                 ch()
  115.                             }
  116.                         }
  117.                     }
  118.                 }
  119.             }
  120.         }
  121.     }
  122.    
  123.     func loadCommentLikes(comment:Comment, completionHandler ch: () -> Void){
  124.         comment.likes = []
  125.         let predicate = NSPredicate(format: "comment == %@", CKReference(record: comment.recordName, action: .DeleteSelf))
  126.         let query = CKQuery(recordType: "like_comment", predicate: predicate)
  127.  
  128.         db.performQuery(query, inZoneWithID: nil){
  129.             records, error in
  130.  
  131.             if error == nil{
  132.                 var c = records!.count
  133.                 if c == 0 {
  134.                     ch()
  135.                 }
  136.                 for record in records!{
  137.                     self.loadUser(record.objectForKey("user") as! CKReference){
  138.                         user in
  139.                         comment.likes!.append(user!)
  140.                         c--
  141.                         if c == 0{
  142.                             ch()
  143.                         }
  144.                     }
  145.                 }
  146.             }
  147.         }
  148.     }
  149.    
  150.     func loadPostLikes(post:Post, completionHandler ch: () -> Void){
  151.         post.likes = []
  152.         let predicate = NSPredicate(format: "post == %@", CKReference(record: post.recordName, action: .DeleteSelf))
  153.         let query = CKQuery(recordType: "like_post", predicate: predicate)
  154.        
  155.         db.performQuery(query, inZoneWithID: nil){
  156.             records, error in
  157.             if error == nil{
  158.                 var c = records!.count
  159.                 if c == 0 {
  160.                     ch()
  161.                 }
  162.                 for record in records!{
  163.                     self.loadUser(record.objectForKey("user") as! CKReference){
  164.                         user in
  165.                         post.likes!.append(user!)
  166.                         c--
  167.                         if c == 0{
  168.                             ch()
  169.                         }
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.     }
  175.    
  176.     /* *** User functions *** */
  177.     func login(username:String, password: String, completionHandler ch: (User? -> Void)){
  178.         let predicate = NSPredicate(format: "username == %@ AND password == %@", username, password)
  179.         let query = CKQuery(recordType: "user", predicate: predicate)
  180.        
  181.        
  182.         db.performQuery(query, inZoneWithID: nil){
  183.             records, error in
  184.            
  185.             if error == nil {
  186.                 if records?.count > 0{
  187.                     // Logged in successfully
  188.                     let username = records?[0].objectForKey("username") as! String
  189.                     let fullname = records?[0].objectForKey("fullname") as! String
  190.                     let gender = records?[0].objectForKey("gender") as! String
  191.                     let about = records?[0].objectForKey("about") as! String
  192.                    
  193.                     ch(User(record: records![0], username: username, fullname: fullname, gender: gender, about: about))
  194.                     return
  195.                 }
  196.             }else{
  197.                 // TODO: This error (also?) happends when user is not connected to iCloud
  198.                 print("Error: \(error)")
  199.             }
  200.             ch(nil)
  201.         }
  202.     }
  203.    
  204.    
  205.     func usernameExists(username:String, completionHandler ch: (exists: Bool) -> Void){
  206.         let predicate = NSPredicate(format: "username == %@", username)
  207.         let query = CKQuery(recordType: "user", predicate: predicate)
  208.        
  209.         db.performQuery(query, inZoneWithID: nil){
  210.             (records, error) -> Void in
  211.            
  212.             ch(exists: error == nil && records?.count > 0)
  213.         }
  214.     }
  215.    
  216.    
  217.     func register(username:String, password:String, fullname:String, gender:String, completionHandler ch: (user:User) -> Void){
  218.         let record = CKRecord(recordType: "user")
  219.        
  220.         record.setObject(username, forKey: "username")
  221.         record.setObject(password, forKey: "password")
  222.         record.setObject(fullname, forKey: "fullname")
  223.         record.setObject(gender, forKey: "gender")
  224.         record.setObject("", forKey: "about")
  225.         record.setObject(NSDate(), forKey: "last_action")        
  226.        
  227.         db.saveRecord(record){
  228.             r, error -> Void in
  229.             let user = User(record: r!, username: username, fullname: fullname, gender: gender, about: "")
  230.             ch(user: user)
  231.         }
  232.     }
  233.    
  234.     func loadFriends(user: User, completionHandler ch: () -> Void){
  235.         user.friends = []
  236.  
  237.         let predicate1 = NSPredicate(format: "user_one == %@", user.record)
  238.         let predicate2 = NSPredicate(format: "user_two == %@", user.record)
  239.         let query1 = CKQuery(recordType: "friends", predicate: predicate1)
  240.         let query2 = CKQuery(recordType: "friends", predicate: predicate2)
  241.        
  242.         var friendsCount = 0
  243.         var both = false
  244.         let f:(User)->Void = {
  245.             friend in
  246.             friendsCount--
  247.             user.friends?.append(friend)
  248.            
  249.             if friendsCount == 0 && both {
  250.                 ch()
  251.             }
  252.         }
  253.        
  254.        
  255.         db.performQuery(query1, inZoneWithID: nil){
  256.             (records, error) -> Void in
  257.            
  258.             friendsCount += records!.count
  259.            
  260.             for record in records!{
  261.                 self.loadUser(record.objectForKey("user_two") as! CKReference){
  262.                     friend in
  263.                     f(friend!)
  264.                 }
  265.             }
  266.             both = true
  267.         }
  268.        
  269.        
  270.        
  271.         db.performQuery(query2, inZoneWithID: nil){
  272.             (records, error) -> Void in
  273.            
  274.             friendsCount += records!.count
  275.            
  276.             for record in records!{
  277.                 self.loadUser(record.objectForKey("user_one") as! CKReference){
  278.                     friend in
  279.                     f(friend!)
  280.                 }
  281.             }
  282.            
  283.             both = true
  284.         }
  285.  
  286.  
  287.     }
  288.    
  289.     func loadUser(userReference:CKReference, completionHandler ch: (user:User?) -> Void){
  290.         db.fetchRecordWithID(userReference.recordID){
  291.             record, error in
  292.             let username = record?.objectForKey("username") as! String
  293.             let fullname = record?.objectForKey("fullname") as! String
  294.             let gender = record?.objectForKey("gender") as! String
  295.             let about = record?.objectForKey("about") as! String
  296.            
  297.             ch(user: User(record: record!, username: username, fullname: fullname, gender: gender, about: about))
  298.         }
  299.     }
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement