2016-08-01 6 views
0

Database structureObjective-C - Firebase Abrufen von Daten aus der Datenbank und füllen Sie in Tabelle

Ich habe eine Datenbank Firebase Setup (bitte auf das Bild beziehen).

Ich habe einen "FeedViewController", um den Inhalt jedes Beitrags in der Datenbank anzuzeigen. Ein Benutzer kann einen oder mehrere Beiträge veröffentlichen.

Beim Abrufen dieser Posts aus dem Firebase-Snapshot und beim Speichern dieser Posts in einem Wörterbuch finde ich, dass die Werte dieses Wörterbuchs außerhalb der Funktion "observeEventType" des Firebase nicht zugänglich sind.

Meine Idee war, diese Schlüssel-Wert-Paare abzurufen, sie auf einem benutzerdefinierten NSObject-Objekt (Post * post) zu speichern und dieses Objekt zu verwenden, um die Tabellenansicht für meinen "FeedViewController" zu laden. Innerhalb der Funktion "observateEventType" kann ich auf die Werte des Objekts zugreifen, aber außerhalb bin ich nicht. Daher weiß ich nicht, wie diese Werte zum Füllen der Tabellenansicht in meinem FeedViewController verwendet werden. Ich verstehe, dass diese Funktion "observeEventType" ein asynchroner Rückruf ist, aber ich weiß nicht, wie auf die Werte des Objekts zuzugreifen und meine Tabelle aufzufüllen. Ich habe keine Ahnung, was die dispatch_async (dispatch_get_main_queue() Funktion hier tut. Jede mögliche Hilfe würde sehr geschätzt werden. Dank!

FeedViewController.m

#import "FeedViewController.h" 
#import "Post.h" 
#import "BackgroundLayer.h" 
#import "SimpleTableCell.h" 
#import "FBSDKCoreKit/FBSDKCoreKit.h" 
#import "FBSDKLoginKit/FBSDKLoginKit.h" 
#import "FBSDKCoreKit/FBSDKGraphRequest.h" 
@import Firebase; 
@import FirebaseAuth; 
@import FirebaseStorage; 
@import FirebaseDatabase; 

@interface FeedViewController() 

@property (strong, nonatomic) Post *post; 

@end 

@implementation FeedViewController 

-(void) viewDidLoad { 

[super viewDidLoad]; 

_ref = [[FIRDatabase database] reference]; 

self.post = [[Post alloc] init]; 

/* 

_idArr = [[NSMutableArray alloc] init]; 


_postDict = [[NSMutableDictionary alloc] init]; 
_idDict = [[NSMutableDictionary alloc] init]; 
_postID = [[NSMutableArray alloc] init]; 

_userName = [[NSMutableArray alloc] init]; 
_placeName = [[NSMutableArray alloc] init]; 
_addressLine1 = [[NSMutableArray alloc] init]; 
_addressLine2 = [[NSMutableArray alloc] init]; 
_ratings = [[NSMutableArray alloc] init]; 
_desc = [[NSMutableArray alloc] init]; 
_userEmail = [[NSMutableArray alloc] init]; 
_userIDArray = [[NSMutableArray alloc] init]; 
*/ 
[self fetchData]; 

NSLog(@"Emails: %@", _post.userID); 


} 

-(void) viewWillAppear:(BOOL)animated { 

[super viewWillAppear:animated]; 

CAGradientLayer *bgLayer = [BackgroundLayer blueGradient]; 
bgLayer.frame = self.view.bounds; 
[self.view.layer insertSublayer:bgLayer atIndex:0]; 

FIRUser *user = [FIRAuth auth].currentUser; 

if (user != nil) 
{ 
    //fbFirstName.text = user.displayName; 
    //fbEmail.text = user.email; 
    NSURL *photoUrl = user.photoURL; 
    NSString *userID = user.uid; 
    //NSString *uploadPath = [userID stringByAppendingString:@"/profile_pic.jpg"]; 
    //NSData *data = [NSData dataWithContentsOfURL:photoUrl]; 
    //ProfilePic.image = [UIImage imageWithData:data]; 

    FIRStorage *storage = [FIRStorage storage]; 
    FIRStorageReference *storageRef = [storage referenceForURL:@"gs://foodsteps-cee33.appspot.com"]; 

    NSString *access_token = [[NSUserDefaults standardUserDefaults] objectForKey:@"fb_token"]; 

    FBSDKGraphRequest *friendList = [[FBSDKGraphRequest alloc] 
            initWithGraphPath:@"me?fields=friends" 
           parameters:nil 
            tokenString: access_token 
            version:nil 
            HTTPMethod:@"GET"]; 

    [friendList startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, 
              id result, 
              NSError *error) { 

     if(error == nil) 
     { 
      //NSLog(@"%@", result); 
      NSDictionary *dictionary = (NSDictionary *)result; 
      NSDictionary *dict = [dictionary objectForKey:@"friends"]; 

      _idArray = [[NSMutableArray alloc] init]; 

      for(int i = 0; i < [[dict objectForKey:@"data"] count]; i++) { 

       [_idArray addObject:[[[dict objectForKey:@"data"] objectAtIndex:i] valueForKey:@"id"]]; 
      } 

      //NSLog(@"%@", idArray); 
     } 

     else { 
      NSLog(@"%@",error); 
     } 
    }]; 


} 
} 

-(void) fetchData { 

_refHandle = [[_ref child:@"users"]  observeEventType:FIRDataEventTypeValue 
              withBlock:^(FIRDataSnapshot * _Nonnull snapshot) 
       { 
        NSDictionary *postDict = snapshot.value; 
        NSLog(@"%@", postDict); 

        for(NSString *aKey in [postDict allKeys]) 
        { 
         // do something like a log: 
         _post.userID = aKey; 
        } 

        //_post. 
        //[_post setValuesForKeysWithDictionary:postDict]; 
        [self.tableView reloadData]; 

      }]; 

NSLog(@"Emails: %@", _post.userID); 

dispatch_async(dispatch_get_main_queue(), ^{ 

[self.tableView reloadData]; 

}); 
} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [[_ref child:@"users"] removeObserverWithHandle:_refHandle]; 
} 

@end 

Post.m

#import "Post.h" 

@implementation Post 


- (instancetype)init { 

return [self initWithUid:@"" 
       andPostid:@"" 
      andUsername:@"" 
       andDesc:@"" 
       andRatings:@"" 
      andPlacename:@"" 
     andAddressLine1:@"" 
     andAddressLine2:@"" 
       andEmail:@""]; 
} 

- (instancetype)initWithUid:(NSString *)userID 
      andPostid:(NSString *)postID 
andUsername: (NSString *)userName 
andDesc:(NSString *)desc 
andRatings:(NSString *)ratings 
andPlacename: (NSString *)placeName 
andAddressLine1: (NSString *)addressLine1 
andAddressLine2: (NSString *)addressLine2 
andEmail: (NSString *)userEmail { 

self = [super init]; 
if(self) { 
    self.userID = userID; 
    self.postID = postID; 
    self.userName = userName; 
    self.desc = desc; 
    self.ratings = ratings; 
    self.placeName = placeName; 
    self.addressLine1 = addressLine1; 
    self.addressLine2 = addressLine2; 
    self.userEmail = userEmail; 
} 

return self; 
} 

@end 

Antwort

1

Ihr Ansatz ist, was ich zunächst versucht habe. Aber ich hatte Probleme beim Zugriff auf es in Cellforrowatindexpath. Die Sache, die für mich funktioniert ist.

- (void)configureDatabase :(NSUInteger)postsAmount{ 

_ref = [[FIRDatabase database] reference]; 
// Listen for new messages in the Firebase database 
_refHandle = [[[[_ref child:@"posts"]queryOrderedByKey] queryLimitedToLast:postsAmount]observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { 

     [_posts insertObject:snapshot atIndex:0]; 
    }]; 
} 
Dann

in ViewDidAppear

 [self configureDatabase:_numberOfPosts]; 

dann schließlich

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

FIRDataSnapshot *postsSnapshot = _posts[indexPath.section]; 

NSDictionary *post = postsSnapshot.value; 
//use key values to create your views. 
} 

auch

@property (strong, nonatomic) NSMutableArray<FIRDataSnapshot *> *posts; 

Was dies bedeutet ist Abfragen für Firebase Ihre Werte und erhält Schnappschüsse. Diese Snapshots werden dann in Ihr _posts-Array platziert und Sie können dann mit anderen Methoden darauf zugreifen.