2012-08-02 36 views
6

Tôi có một danh sách các hình ảnh trong gói ứng dụng và cần để hiển thị những người thích hợp trong ứng dụng, hình ảnh có định dạng:NSPredicate: làm thế nào để KHÔNG kết thúc?

###_photo_#.jpg 

###: toy id, from 1000 to 2000 
#: photo id, from 1 

ví dụ như vậy

1000_photo_1.jpg 
1000_photo_2.jpg 

tôi đã sử dụng để có được danh sách của các tệp trong gói và sử dụng biến vị ngữ để lọc ra các tệp khác:

@"self ENDSWITH '.jpg' AND self BEGINSWITH '%d_photo_'", toyId 

nhưng bây giờ có hình ảnh võng mạc kết thúc bằng @ 2x.jpg, vì vậy phương pháp này cần o được sửa, tôi đang nghĩ đến việc thêm:

NOT ENDSWITH '@2x.jpg' 

nhưng điều này có đúng không? Tôi nên nói:

NOT (ENDSWITH '@2x.jpg') 

hay:

(NOT ENDSWITH '@2x.jpg') 

để thay thế?

+2

Bất kỳ lý do nào khiến bạn không thể sử dụng predicateWithBlock? – Jessedc

Trả lời

1

Tôi nghĩ rằng một tùy chọn tốt hơn trong iOS 4.0+ là sử dụng NSPredicate predicateWithBlock: để xác định các điều kiện của bạn. Bằng cách đó bạn có thể sử dụng các chức năng NSString tiêu chuẩn như hasSuffix: để kiểm tra kết thúc của bạnVới trường hợp âm.

Thanh toán hướng dẫn hay tại đây: http://www.wannabegeek.com/?p=149

Đây là cách cơ bản bạn có thể sử dụng.

NSInteger toyId = 10; 
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    return [evaluatedObject hasSuffix:@".jpg"] && 
    ![evaluatedObject hasSuffix:@"@2x.jpg"] && 
    [evaluatedObject hasPrefix:[NSString stringWithFormat:@"%@_photo_", [NSNumber numberWithInt:toyId]]]; 
}]; 

Sau đó bạn có thể lấy mảng của bạn các tập tin

[arrayOfFiles filterArrayUsingPredicate:predicate]; 
+0

Nhưng 'predicateWithBlock' không hoạt động với kho lưu trữ SQLite, phải không? Nếu sử dụng kho lưu trữ SQLite, bạn phải cung cấp một chuỗi định dạng cho biến vị ngữ. – BallpointBen

8

Bạn có thể sử dụng một chuỗi vị ngữ như thế này:

@"(self ENDSWITH '.jpg') AND NOT (self ENDSWITH '@2x.jpg') AND (self BEGINSWITH '%d_photo_')" 
+0

Tôi nghĩ câu trả lời này đơn giản hơn nhiều so với một biến vị ngữWithBlock. Chắc chắn, nếu bạn cần phải làm những việc khác, predicateWithBlock là con đường để đi, nhưng chỉ đơn giản là để có một điều kiện NOT, chuỗi vị ngữ ngoặc đơn là giải pháp đúng! – ericWasTaken

+0

Từng ưu điểm và nhược điểm. Lợi thế chính của câu trả lời của tôi, không áp dụng cho tình huống của hzxu, là Core Data có thể biến nó thành mệnh đề WHERE của truy vấn cơ sở dữ liệu (có thể sử dụng một chỉ mục). Core Data không thể làm điều đó với một vị từ khối. –

5

Bạn có thể gói gọn một vị ngữ trong ngữ khác:

NSPredicate *positivePredicate = [NSPredicate ...]; 
NSPredicate *negativePredicate = [NSCompoundPredicate notPredicateWithSubpredicate: positivePredicate]; 

T anh ấy cho phép bạn bảo tồn chuỗi định dạng dễ đọc hiện có. Lưu ý rằng với NSCompoundPredicate, bạn cũng có thể xây dựng các vị từ AND và OR. Từ ba (AND, OR, NOT), bạn thậm chí có thể lấy được những thứ như XNOR và các vị từ NAND (mặc dù làm thế nào để làm như vậy là một bài tập còn lại để đọc ...)

1

Hãy thử điều này:

NOT something ENDSWITH '@2x.jpg' 
Các vấn đề liên quan