2012-04-11 9 views
1

エンティティフォルダに対してフェッチ要求を実行しようとしていますが、ソート時にxyzという名前のフォルダを最後のオブジェクトにします。NSSortDescriptorが呼び出されていません

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Folder" inManagedObjectContext:appDelegate.managedObjectContext]; 

    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *lastDescriptor = 
    [[[NSSortDescriptor alloc] initWithKey:@"folderName" ascending:YES comparator:^NSComparisonResult(NSString* name1, NSString* name2) { 
     NSLog(@"descriptor"); 
     if ([name1 isEqualToString:@"xyz"]) { 
      return NSOrderedAscending; 
     } 
     if ([name2 isEqualToString:@"xyz"]) { 
      return NSOrderedDescending; 
     } 

     return [name1 compare:name2]; 
    }] autorelease]; 


    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor]]; 
    [fetchRequest setFetchBatchSize:5]; 

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    self.fetchedResultsController = theFetchedResultsController; 
    self.fetchedResultsController.delegate=self; 

    [fetchRequest release]; 
    [theFetchedResultsController release]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    } 

NSLogステートメントのどれも呼び出されていません。彼らは?フォルダxyzは最後に表示されませんが、すべてがアルファベット順に並べ替えられます。私は何か間違っているのですか?

編集:投稿者の完全なコード

+0

私はおそらくダムの質問ですが、実際にフェッチを実行していますか?これはソートを設定するだけです。 – danh

+0

さて、私は結果を得る、彼らはちょうど適切にソートされていません。私は呼び出している唯一のソート記述子ですが、アルファベット順に結果を得ることになります。 – Snowman

+0

NSLogステートメントが表示されるはずですか? – Snowman

答えて

1

このコード(あなたのコード)作品:

- (void)sortMe { 

    NSDictionary *d0 = [NSDictionary dictionaryWithObject:@"efg" forKey:@"folderName"]; 
    NSDictionary *d1 = [NSDictionary dictionaryWithObject:@"xyz" forKey:@"folderName"]; 
    NSDictionary *d2 = [NSDictionary dictionaryWithObject:@"abc" forKey:@"folderName"]; 
    NSDictionary *d3 = [NSDictionary dictionaryWithObject:@"def" forKey:@"folderName"]; 
    NSArray *testMe = [NSArray arrayWithObjects:d0, d1, d2, d3, nil]; 

    NSSortDescriptor *lastDescriptor = 
    [[NSSortDescriptor alloc] initWithKey:@"folderName" ascending:YES comparator:^NSComparisonResult(NSString* name1, NSString* name2) { 
     NSLog(@"descriptor"); 
     if ([name1 isEqualToString:@"xyz"]) { 
      return NSOrderedAscending; 
     } 
     if ([name2 isEqualToString:@"xyz"]) { 
      return NSOrderedDescending; 
     } 

     return [name1 compare:name2]; 
    }]; 

    NSArray *sorted = [testMe sortedArrayUsingDescriptors:[NSArray arrayWithObject:lastDescriptor]]; 
    for (NSDictionary *d in sorted) { 
     NSLog(@"value=%@", [d valueForKey:@"folderName"]); 
    } 
} 

私はこのコードはあまりにも、動作します予測:

NSError *error; 
NSArray *result = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
// log the array 

私はこの問題を考えますNSFetchedResultsControllerデリゲートセットアップ、コードの他の場所にあります。

+1

これはソートされていない配列を返しました:NSArray * result = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];しかし、同じソート記述子で配列をソートすると、それが動作します。これは、ソート記述子を適用しないフェッチ要求と関係します。これを解決するためにどこから始めなければならないのですか? – Snowman

関連する問題