2016-05-25 41 views
8

Tôi có dữ liệu căn cứ hỏa lực này:Swift iOS: căn cứ hỏa lực Paging

Firebase Data

tôi muốn truy vấn dữ liệu posts qua pagination. Hiện nay mã của tôi là chuyển đổi JS mã này vào Swift đang

let postsRef = self.rootDatabaseReference.child("development/posts") 
postsRef.queryOrderedByChild("createdAt").queryStartingAtValue((page - 1) * count).queryLimitedToFirst(UInt(count)).observeSingleEventOfType(.Value, withBlock: { snapshot in 
.... 

    }) 

Khi truy cập, dữ liệu này page: 1, count: 1. Tôi có thể lấy dữ liệu cho "posts.a" nhưng khi tôi cố truy cập page: 2, count: 1 lợi nhuận vẫn là "posts.a"

Tôi thiếu gì ở đây?

+0

Có một vấn đề logic. Đối với trang: 1, đếm: 1, truy vấn bắt đầu từ 0 và trả về 1 bài đăng. Đối với trang: 2, đếm: 1, truy vấn bắt đầu từ 1 và trả về 1 bài đăng. Cả hai đều dựa trên nút createdAt có các giá trị vừa là con đường vừa 1 nên nó sẽ chỉ trả về bài đầu tiên. – Jay

Trả lời

11

Giả sử bạn đang hoặc sẽ sử dụng childByAutoId() khi đẩy dữ liệu vào Firebase, bạn có thể sử dụng queryOrderedByKey() để đặt hàng dữ liệu theo thứ tự thời gian. Doc here.

Khoá duy nhất được dựa trên dấu thời gian, vì vậy các mục danh sách sẽ tự động được sắp xếp theo thứ tự thời gian.

Để bắt đầu một khóa cụ thể, bạn sẽ phải thêm truy vấn của mình với queryStartingAtValue(_:).

mẫu sử dụng:

var count = numberOfItemsPerPage 

var query ref.queryOrderedByKey() 

if startKey != nil { 
    query = query.queryStartingAtValue(startKey) 
    count += 1 
} 

query.queryLimitedToFirst(UInt(count)).observeSingleEventOfType(.Value, withBlock: { snapshot in 
    guard var children = snapshot.children.allObjects as? [FIRDataSnapshot] else { 
    // Handle error 
    return 
    } 

    if startKey != nil && !children.isEmpty { 
    children.removeFirst() 
    } 

    // Do something with children 
}) 
+0

làm thế nào về thứ tự giảm dần? Có dữ liệu mới nhất trước? – KutakMir

+0

@KutakMir Tôi nghĩ rằng sử dụng: 'queryEndingAtValue' với' queryLimitedToLast' –

+0

@KutakMir Tôi nghĩ rằng @levantAJ là đúng. Bạn có thể sử dụng các phương pháp đó nhưng khóa bạn sẽ chuyển sẽ khác nhau. Thay vì sử dụng khóa của mục cuối cùng được Firebase trả lại, bạn sẽ sử dụng khóa của mục đầu tiên. Cũng thay vì 'removeFirst()', sử dụng 'removeLast()'. Tôi không thể kiểm tra điều này bây giờ vì vậy bạn nên thử nó cho chính mình. :) – timominous

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