2017-08-09 37 views
0

我從nsmanaged對象的核心數據執行提取操作。託管對象的屬性之一是一個NSNumber,對應於對象的id(不是Apple的objectid,我自己的順序NSNumber id方案)。對於具有ID#的給定對象,我想獲取數組中該對象的索引。但是,我找不到一種方法來獲取id#的列表,因爲valueforkey不適用於nsnumbers,而objectforkey會用nsmutablearray引發錯誤。任何人都可以建議如何做到這一點?IOS/Objective-C/Core數據:在NSManaged對象數組中查找NSNumber的索引

這是我的非工作代碼。問題是我無法從獲取的對象中獲取有效的ID列表。

//FETCH ITEMS 
- (id) getItems{ 

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Items"]; 
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"lasttouched" ascending:NO]; 
    [fetchRequest setSortDescriptors:@[sort]]; 
    NSError *error  = nil; 
    self.managedObjectContext = [IDModel sharedInstance].managedObjectContext; 

    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest 
    NSMutableArray *mutableresults = [results mutableCopy]; 
    [mutableresults removeObjectIdenticalTo:[NSNull null]]; 
    NSArray*someids =[[mutableresults valueForKey:@"myid"] mutableCopy]; 
//THIS IS EMPTY WHEN LOGGED 
    _someids = someids;//save to ivar 
     return mutableresults; //an array of activity objects with all their properties 
    } 

    // In method to get index of the object 

    NSInteger myIndex=[_someids indexOfObject:@33]; 
     NSLog(@"anIndex%ld",(long)anIndex); 
+0

':

NSInteger index = -1; for(NSInteger i=0; i<_someids.count; i++) { if([_someids[i] compare:@33] == NSOrderedSame) { index = i; break; // Break after first one is found } } 

所以在最後,如果你跳過映射你的對象,並簡單地把它同一個對象陣列上進行比較是幾乎相同NSArray * someids = [[mutableresults valueForKey:@「myid」] mutableCopy];對於(項目* anItemFetched在結果中){NSLog(@「ItemId:%@,[anItemFetched valueForKey:@」myid「]}'這是否打印您正在尋找的那個? – Larme

+0

爲什麼要檢查'NSNull'實例?如果仔細編寫插入對象的代碼,則不能發生「NSNull」實例。 – vadian

回答

1

您需要將對象重新映射到新的數組中。對於直接的是這樣的:

NSMutableArray *arrayOfIdentifiers = [[NSMutableArray alloc] init]; 
for(WhateverMyManagedObjectIs *item in results) { if(item.myid) [arrayOfIdentifiers addObject:item.myid]; } 

這將導致ID作爲唯一NSNumber對象的數組。由於NSNumber是一個對象,因此indexOfObject可能無法正常工作。原因是它會比較指針而不是值。所以,你需要使用compare方法,如:

NSInteger index = -1; 
    for(NSInteger i=0; i<results.count; i++) { 
     if([[results[i] myid] compare:@33] == NSOrderedSame) { 
      index = i; 
      break; // Break after first one is found 
     } 
    }