2016-04-07 7 views
2

私はカレンダーアプリを作っています。選択した日付の配列が1つあります。ユーザーがこれを以前に選択し、そこに保存されます。[NSDate]とFirebaseの対処方法

var selectedDays = [NSDate]()

アプリの負荷が、私はこれらの日付を表示する必要がありますが、Firebaseは私が唯一の日付が変換され、上記と同じ配列である別の配列var selectedDaysForFirebase = [String]()を持ってNSDate

を受け入れていないので、すべてがovercomplicatedですFirebaseに対応する文字列に変換します。

// 1. Append converted date into selectedDaysForFirebase array 
      let day = dateFormatter.stringFromDate(date) 
      selectedDaysForFirebase.append(day) 

// 2. Push data to Firebase 
      ref.childByAppendingPath("dates").setValue(selectedDaysForFirebase) 

マイFirebase持つユーザー認証:

は、これは私が選択された日付を保存する方法です。だから、すべてのユーザーには、日付付きの小さなデータベースがあります。

Firebaseから配列を遡り、 NSDate

ref.childByAppendingPath("dates").observeEventType(.Value, withBlock: { snapshot in 

     if let dates = snapshot.value as? NSArray { 
      print(dates) 
      // convert firebase array of dates with array of dates that only accepts NSDate 
     } 

     }, withCancelBlock: { error in 
      print(error.description) 
     }) 

この出力を受け入れ、私のselectedDates配列に格納し、グラブに私が持っている私のviewDidLoad

:私はより良い方法があると思い

(
    "2016-04-10", 
    "2016-04-11", 
    "2016-04-12" 
) 

日付を保存してからそれを検索して、誰かが私にこれを手伝ってくれることを願っています。

+0

なぜタイムスタンプを使用しないのですか? – Larme

+0

ああ、私はあまりにもこれがどのように動作するのか分かりません。 NSDateを出力する選択された日付からスタンプを作成するにはどうすればよいですか? – Kira

+0

'NSDate'とNSTimeInterval(' double')(そしてその逆)を変換するために 'dateWithTimeIntervalSince1970:'と 'timeIntervalSinceReferenceDate'を使うことができ、FireBaseにdouble値を格納するだけです。 – Larme

答えて

7

答えは本当にあなたがあなたの日付を使用している方法によって異なります。

'numbers'はFirebaseに保存できません。任意の数値が最初に(Firebaseによって)NSNumberに変換されて保存されます。 Understanding Data

どのように日付を使用するのか、どの程度細分性が必要になるかを決定する必要があります。いくつかのケースでは

2016年4月6日

は十分ですが、他の回は、あなたがより多くの

2016年4月6日14時○○分00秒

が必要な場合があります

ソート可能で簡単に操作でき、NSDateオブジェクトに持ち込むこともNSDateオブジェクトから取り出すこともできるので、これらを単に文字列として保存することをお勧めします。

NSDateをフォーマットされた文字列に変換するためのサンプルコードがあります。これはタイムスタンプのようなもので、Firebaseに文字列として保存することができます。

NSDateFormatter *dateFormat = [NSDateFormatter new]; 
[dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"]; 

NSString *dateString = [dateFormat stringFromDate:[NSDate date]]; 

NSLog(@"%@",dateString); 

とフォーマットされた文字列からNSDate

に他の方法
NSDate *d = [NSDate new]; 

d = [dateFormat dateFromString:dateString]; 

NSLog(@"the date %@", d); 

スーパー最も重要なことは、次のとおりです。一貫性を保ちます。ただし、コード内で毎回同じ方法を実行します。

もう1つのこと。配列の。 Arrayは、Firebaseの特定のユースケース状況でのみ控えめに使用する必要があります。特定のインデックスにアクセスできない場合や、単一のインデックスを変更、追加、削除することができますので、作業に挑戦することができます。

はここ

my_dates 
    date_0 
     date_stamp: 2016-04-06 
    date_1 
     date_stamp: 2016-04-07 

日付キー(date_0、DATE_1)がchildByAutoIdで生成されますはるかに優れた構造です。

+0

私は文字列としてそれらを格納することを決めたと私は風と日付を操作するクールなココアポッドを発見したので、 。 FirebaseがNSDatesを受け入れるなら、これはとても簡単でしょう:) – Kira

+0

あなたが文字列としてそれらを保存する私の提案が好きなら、答えを受け入れてください! – Jay

+0

ちょっと@KiraArikあなたは私にそのポッドが何であるか教えてもらえますか?ありがとう! –

6

はdoubleから日付を取得:周り

var interval = Double() 
var date = NSDate() 
date = NSDate(timeIntervalSince1970: interval) 

他の方法で、日付から二重の取得:

interval = date.timeIntervalSince1970 
関連する問題