0

私は目的の C ブロックを理解しているところです。ほとんどの場合、私は Web 呼び出しの非同期ブロックを扱ってきました。しかし、ここでは、カスタム オブジェクトの並べ替えられた配列を (プロパティのアルファベット順で) 返すメソッドがあります。

ここで、このブロックがどのように機能するのか少し混乱していますか? それは非同期呼び出しですか (この場合、入力配列自体を生成する必要があります)。誰か説明できますか?

+(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;
}
4

2 に答える 2

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ブロック内に1 つ以上のループを導入する必要があるため、複雑な並べ替え操作をsortedArrayUsingDescriptors:次のように使用する方が効率的です。

NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"isFavourite" ascending:NO];
NSSortDescriptor *descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
sortedArray = [unsortedList sortedArrayUsingDescriptors:@[descriptor1, descriptor2]];
于 2016-09-24T07:53:12.993 に答える
0

これはブロック中の同期呼び出しであり、ブロックを 2 つのオブジェクトを比較する関数として扱うことができます。この比較機能により、システムは配列をソートできます。コードで説明:

function : ^NSComparisonResult(id a, id b)- ブロック コードで提供されます。

NSArray sortedArrayUsingComparator do:

  1. 配列から 2 つのオブジェクトを取得します。
  2. この 2 つのオブジェクトをブロック内の比較関数で比較します。(NSOrderedAscending、NSOrderedSame、NSOrderedDescending の結果を取得)
  3. 比較結果に従って、オブジェクトを新しい配列に入れます。
  4. 元の配列にまだオブジェクトが残っている場合は、1 つ続行します。
  5. すべてのオブジェクトがソートされた後、新しい配列を返します。

(1,4 の操作は、ソート アルゴリズムに基づいて異なる場合がありますが、基本的な考え方は同じです。)

于 2013-11-07T07:57:35.387 に答える