2010-08-25 29 views
6

Tôi có rất nhiều người NSManagedObjects mà tôi cần lọc và hy vọng sẽ làm điều đó trong tìm nạp ban đầu thay vì lọc mảng sau đó. Tôi đã selectors đã qua sử dụng trong các vị từ trước đó, nhưng không bao giờ khi lấy NSManagedObjects, ví dụ tôi có tất cả các nhân viên của tôi và sau đó tôi sử dụng vị này trên NSArray ...NSPredicate với chức năng hoặc bộ chọn

[NSPredicate predicateWithFormat:@"SELF isKindOfClass:%@", [Boss class]] 

... nhưng bây giờ tôi muốn làm một chút toán học dựa trên các thuộc tính khác nhau của các đối tượng của tôi. Tôi nghĩ rằng tôi có thể làm một việc gì đó như ...

[NSPredicate predicateWithFormat:@"SELF bonusIsAffordable:%f", howMuchMoneyTheCompanyHas]; 

..where bonusIsAffordable: là một phương pháp của lớp Nhân viên của tôi và tính toán xem tôi có thể trả tiền thưởng không. Nhưng tôi gặp lỗi ...

Unknown/unsupported comparison predicate operator type cocoa 

Bất kỳ ý tưởng nào tôi đang vặn lên?

Trả lời

13

Bạn có thể thực thi mã tùy ý trong một NSPredicate chỉ khi đủ điều kiện đối tượng trong bộ nhớ. Trong trường hợp của NSPersistentStore được hỗ trợ SQLite, NSPredicate được biên dịch thành SQL và được thực hiện trên công cụ truy vấn SQLite. Kể từ khi SQLite không có kiến ​​thức về Objective-C, cũng không phải là bất kỳ đối tượng instantiated, không có cách nào để thực hiện mã tùy ý.

Đối với truy vấn trong bộ nhớ (đối với bộ sưu tập hoặc bộ nhớ trong lõi hoặc bộ nhớ nguyên tử), hãy xem NSExpression, cụ thể là +[NSExpression expressionForFunction:selectorName:arguments:]+[NSExpression expressionForBlock:arguments:]. Với một biểu thức như vậy, bạn có thể xây dựng một chương trình NSPredicate theo chương trình.

+0

OK, điều đó có ý nghĩa. Tôi đã tự hỏi làm thế nào nó sẽ đi về việc sử dụng SELF mỗi lần. Tôi cho rằng nó sẽ kéo từng vật thể vào bộ nhớ, tôi giả định sai. – rob5408

0

Chuỗi vị ngữ của bạn không cho đối tượng vị ngữ biết phải làm gì. Phương thức này có lẽ trả về một boolean nhưng vị từ không biết phải so sánh nó với cái gì. Bạn cũng có thể đã cho nó một chuỗi vị ngữ "TRUE" và dự kiến ​​nó sẽ biết phải làm gì với nó.

Hãy thử:

[NSPredicate predicateWithFormat:@"(SELF bonusIsAffordable:%f)==YES", howMuchMoneyTheCompanyHas]; 
+0

OK, cho rằng một shot và nhận 'Không thể phân tích các chuỗi định dạng "(TỰ bonusIsAffordable:% f) == YES". Ngoài ra, cho nó một chuỗi vị ngữ của sự thật sẽ làm việc, giống như "(SELF bonusIsAffordable:% f) == YES" về mặt lý thuyết sẽ đánh giá boolean và "SELF isKindOfClass:% @" đánh giá boolean, không? – rob5408

14

này được dễ dàng hơn nhiều với Blocks:

NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 

    return [evaluatedObject isKindOfClass:[Boss class]]; 
}]; 
+0

Nếu bạn cần làm điều này một cách đồng bộ thì sao? – zakdances

+2

Điều này không hoạt động trong iOS với cửa hàng liên tục – Krishnan

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