这个块如何恢复工作?

时间:2013-07-06 04:19:13

标签: ios objective-c-blocks

我试图解释这个区块代码:

情景1

NSIndexSet* indexes = [[self.orderItems allKeys] indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        IODItem* key = obj;
        return [searchItem.name isEqualToString:key.name] && searchItem.price == key.price;
    }];

好的,所以我得到self.orderItems字典的allKeys并将它们作为id obj传递给块{}。在块内,该obj被分配给IODItem *键。然后调用isEqualToString和比较器==一样返回BOOL。这对我来说很有意义,因为该块是返回类型BOOL。那么如何填充索引的NSIndex集?

情景2

NSArray* keys = [[self.orderItems allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        IODItem* item1 = (IODItem*)obj1;
        IODItem* item2 = (IODItem*)obj2;
        return [item1.name compare:item2.name];
    }];

所以我再次为那本词典得到了所有的凯斯。然后我sortArrayUsingComparator并将密钥传递给obj1& obj2的?这令人困惑。 obj1& obj2只是[self.orderItems allKeys] -array中的键?

然后我拿走那些2个obj并将每个obj分配给不同的IDOItem。然后我实际上返回items1& 2?这再次令人困惑。我以为我正在填写NSArray *键。为什么我要归还2件事?

情景3

// 3 - Enumerate items and add item name and quantity to description
[keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    IODItem* item = (IODItem*)obj;
    NSNumber* quantity = (NSNumber*)[self.orderItems objectForKey:item];
    [orderDescription appendFormat:@"%@ x%@\n", item.name, quantity];
}];

我枚举通过keys数组(实际上是从SCENARIO 2获得)并使用密钥obj并将其分配给IODItem项。但这里是我迷路的地方......我把objectForKey项目用作数量?如果objectForKey返回与该键配对的对象,并且键“item”指的是id obj,则该id obj是来自排序键数组的键。所以它是关键,而不是价值!不是吗?

1 个答案:

答案 0 :(得分:1)

如果您将块视为带参数和返回类型的方法,那就不会太混乱。第一种方法是迭代整个键集并确定它们是否通过了您创建的测试。如果您的区块返回' YES'然后将它添加到新索引集中。如果该块返回“否”'然后它被忽略了。生成的索引集将引用通过测试的一组完整的键。

第二种方法是一种在数组上执行自定义排序的方法。根据哪个对象应该更接近数组的开头,您可以返回NSOrderedAscending,NSOrderedSame或NSOrderedDescending。这可能会根据您对排序的标准而改变。您基本上完成的操作在第一个对象的名称上被称为compare:方法'属性。根据这是什么数据类型(我假设它是一个NSString),你的块将从NSString调用compare:方法。如果它是NSNumber或其他类,它将调用该类的compare:方法等。compare:方法还返回NSComparisonResult(上面列出的三个选项之一)。

添加了方案3:

对于方案3,在枚举'键的同时,每个' id obj'是字典中的一个键,而不是IODItem,因为你已经对它进行了编码。要获得适用的IODItem,您可能需要执行类似的操作(我假设self.orderItems引用了NSDictionary对象):

__block NSMutableString *orderDescription;
__block NSNumber *quantity;

[keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
   NSString* currentKey = (NSString*)obj;
   IODItem *item = [self.orderItems objectForKey:currentKey];
   quantity = item.quantity;
   [orderDescription appendFormat:@"%@ x%@\n", item.name, quantity];
}];