2014-08-27 42 views
13

Tôi có một ứng dụng iOS sử dụng Firebase và hiện có một vài từ điển có khóa là đối tượng NSDate. Vấn đề rõ ràng với điều này là NSDate rút ra từ thời gian hệ thống của thiết bị, không phổ biến.Làm cách nào để nhận được dấu thời gian máy chủ từ API iOS của Firebase?

Với cách đó, cách tốt nhất để nhận dấu thời gian máy chủ (tương tự như Firebase.ServerValue.TIMESTAMP cho API Web) bằng API iOS của Firebase để tôi có thể sắp xếp các từ điển theo thứ tự thời gian?

Tôi cũng biết về bản chất thời gian của các ID được tạo bởi childByAutoID, nhưng tôi không thể tìm ra cách thích hợp để sắp xếp chúng theo mã. Trong khi chúng có thể được trả lại theo thứ tự thời gian, bất cứ lúc nào một cái gì đó giống như allKeys được gọi trên chúng, thứ tự đi ra ngoài cửa sổ.

Bất kỳ trợ giúp nào về vấn đề này sẽ được đánh giá rất nhiều!

+0

Tìm thấy ít công cụ này - https://github.com/freak4pc/NSDate-ServerDate - nhưng nó vẫn còn tốt đẹp để biết nếu có một số giải pháp Firebase cung cấp cho việc này. –

Trả lời

28

Cập nhật: Trong Firebase 3.0 + Swift, bạn có thể sử dụng FIRServerValue.timestamp(). Trong mục tiêu-C, đây là [FIRServerValue timestamp].

Trong Swift, bây giờ bạn có thể sử dụng FirebaseServerValue.timestamp() với Firebase 2.0.3+ (trước 3.0).

Tương đương với Firebase.ServerValue.TIMESTAMP trong iOS là kFirebaseServerValueTimestamp. Ngay bây giờ, điều này chỉ làm việc cho Objective-C chứ không phải Swift.

Trong Swift, bạn có thể tạo dấu thời gian toàn cầu của riêng bạn với

let kFirebaseServerValueTimestamp = [".sv":"timestamp"] 

và sau đó bạn sẽ có thể sử dụng kFirebaseServerValueTimestamp trong cùng một cách.

Nhưng bạn chỉ có thể sử dụng giá trị này làm giá trị hoặc mức độ ưu tiên của nút. Bạn sẽ không thể đặt nó làm tên khóa (mặc dù, tôi cũng không tin bạn có thể sử dụng API Web).

Nói chung, gọi allKeys trên một cuốn từ điển does not guarantee order. Nhưng nếu bạn đang sử dụng childByAutoID tại một nút, bạn có thể lấy lại thứ tự đúng bằng cách ra lệnh NSArray trả về bởi allKeys thứ tự từ điển. Một cái gì đó như thế này sẽ làm việc:

[ref observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { 
    NSDictionary *value = snapshot.value; 
    NSLog(@"Unsorted allKeys: %@", value.allKeys); 
    NSArray *sortedAllKeys = [value.allKeys sortedArrayUsingSelector:@selector(compare:)]; 
    NSLog(@"Sorted allKeys: %@", sortedArray); 
}]; 

này tương tự như sắp xếp một NSArray alphabetically, nhưng khi sắp xếp các ID tự động tạo ra, bạn làm không muốn cục bộ hoặc trường hợp loại nhạy cảm, vì vậy bạn sử dụng compare: thay vì localizedCaseInsensitiveCompare:

+0

tuyệt vời, cảm ơn một tấn! –

2

Lưu ý: Dường như dấu thời gian được thêm SAU đối tượng của bạn được lưu giữ trong Firebase. Điều này có nghĩa là nếu bạn có .Giá trị sự kiện nghe được thiết lập trên vị trí đối tượng của bạn được tiếp tục, nó sẽ được kích hoạt TWICE. Một lần cho đối tượng ban đầu được lưu trữ trong vị trí, và một lần nữa cho dấu thời gian được thêm vào. Vật lộn với vấn đề này trong nhiều ngày :(

thông tin hữu ích cho bất kỳ ai khác không thể hiểu tại sao người nghe sự kiện của họ được kích hoạt hai lần/nhiều lần!

1

Bạn có thể nhận Time Stamp sử dụng FIRServerValue.timestamp().

Nhưng, vì trình nghe FIRServerValue.timestamp() được gọi hai lần. Người nghe sẽ được gọi hai lần.

2

Tính đến căn cứ hỏa lực 4.0 bạn có thể sử dụng ServerValue.timestamp()

ví dụ:

let ref = Database.database().reference().child("userExample") 
    let values = ["fullName": "Joe Bloggs", "timestamp": ServerValue.timestamp()] as [String : Any] 

    ref.updateChildValues(values) { (err, ref) in 

     if let err = err { 
      print("failed to upload user data", err) 
      return 
     } 

    } 
Các vấn đề liên quan