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