2013-09-25 64 views
0

我正在理解目標C塊。大多數情況下,我一直在處理Web呼叫的異步塊。但在這裏,我有一個方法返回自定義對象的排序數組(按照屬性的字母順序)。sortedArrayUsingComparator的行爲

這裏我有點困惑這個塊如何工作?它是一個異步調用(在這種情況下,它應該產生輸入數組本身)。有人可以解釋嗎?

+(NSArray*)sortedListAlphabetically:(NSArray*)_unsortedList{ 
    NSArray *sortedArray; 
    sortedArray = [_unsortedList sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSString *first = [(customObject*)a userName]; 
     NSString *second = [(customObject*)b userName]; 
     return [first compare:second]; 
    }]; 
    return sortedArray; 
} 

回答

0

這是塊中的同步調用,您可以將該塊視爲比較兩個對象的函數。使用此比較功能,系統可以對陣列進行排序。按代碼說明:

function : ^NSComparisonResult(id a, id b) - 由您在代碼塊中提供。

的NSArray sortedArrayUsingComparator做:

  1. 獲得來自陣列的兩個對象。
  2. 通過塊中的比較功能比較這兩個對象。 (得到NSOrderedAscending,NSOrderedSame,NSOrderedDescending的結果)
  3. 根據比較結果將對象放到新數組中。
  4. 如果仍有對象留在原點數組中,請繼續。
  5. 在所有對象排序後返回新數組。

(1,4-操作可以根據排序算法有所不同,但基本思路是一樣的。)

0

值得一提的是,這種方法不提供自身的遞歸循環中多種排序標準操作。比方說,你要有點像這個unsortedList = @[@{@"name":"...", @"isFavourite":"..."},...]放置最愛之前不喜歡的元素和名稱的字母順序排序每個小組的數組,下面的代碼將無法正常工作:

sortedArray = [unsortedList sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { 
     NSDictionary *one = (NSDictionary*)obj1; 
     NSDictionary *two = (NSDictionary*)obj2; 
     NSString *name1 = [one objectForKey:@"name"]; 
     NSString *name2 = [two objectForKey:@"name"]; 
     NSInteger isFav1 = [[one objectForKey:@"isFavourite"] integerValue]; 
     NSInteger isFav2 = [[two objectForKey:@"isFavourite"] integerValue]; 
     if (isFav1 > isFav2) 
      return NSOrderedAscending; 
     else if (isFav1 < isFav2) 
      return NSOrderedDescending; 
     else 
      return [name1 compare:name2]; 
    }]; 

你必須介紹一下里面的一個或多個for循環塊,所以我發現更高效的複雜分類操作使用sortedArrayUsingDescriptors:這樣的:

NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"isFavourite" ascending:NO]; 
NSSortDescriptor *descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
sortedArray = [unsortedList sortedArrayUsingDescriptors:@[descriptor1, descriptor2]];