最近我在Cocoa中看到了方法名称中使用的"context"一词,但我不明白其含义.我已经看到了它在像核心数据(的地方NSManagedObjectContext)和核芯显卡(CGBitmapContextCreate),但它似乎是各地(用NSSet,NSArray,NSObject).我假设它来自c世界.
他们在谈论这个背景是什么?
这只是术语,你提到的背景是无关的.单词上下文通常用于描述特定的"工作空间".
例如,a CGContextRef或NSGraphicsContext存储可以执行绘图操作的图形空间.
NSManagedObjectContext存储NSManagedObjects特定持久性商店的"工作集" .
每个API的文档都详细描述了每个上下文的内容.
没有特别的意义,但有两个常见的含义.
第一个是与数据库,持久层,图形和这样的野兽连接,你需要一些"范围","连接"或"状态"的概念.例如,在将数据保存到数据库时,通常需要打开数据库,然后保存一些数据库'句柄',您将在后续操作中参考.可以有许多不同的连接,因此有许多不同的"手柄".换句话说,可以存在许多DB 上下文.OpenGL也是如此.
Context在各种回调和选择器传递API中也经常使用.在回调发生或选择器被执行时,它只是您想要接收的一些数据块.通常的用例是当您多次订阅并需要将这些情况分开时:
// In one part of code not far away.
[anObject subscribeToEvent:NSObjectEventFoo withContext:@"one"];
// Somewhere else.
[anObject subscribeToEvent:NSObjectEventFoo withContext:@"two"];
// And when the callback happens:
- (void) eventFooHappenedInContext: (id) context
{
if ([context isEqual:@"one"]) { /* something */ }
if ([context isEqual:@"two"]) { /* something else */ }
}
Run Code Online (Sandbox Code Playgroud)
上下文也用于排序API,就像NSArray你提到的那样.例如,如果你想根据存储在a中的一些权重对对象进行排序,NSDictionary你可以使用上下文来传递权重:
NSInteger weightSort(id obj1, id obj2, void *context)
{
NSDictionary weights = (NSDictionary*) context;
const int weight1 = [[weights objectForKey:obj1] intValue];
const int weight2 = [[weights objectForKey:obj2] intValue];
if (weight1 < weight2)
return NSOrderedAscending;
else if (weight1 > weight2)
return NSOrderedDescending;
else
return NSOrderedSame;
}
Run Code Online (Sandbox Code Playgroud)
(这有点人为,但我认为你明白了.)
我发现有趣的是,上下文很多时候只是一个穷人对语言中缺失的闭包的解决方案.因为有了闭包,你可以简单地传递一个单独的回调处理程序,就像在JavaScript中一样:
anObject.subscribeToEvent(eventFoo, function() { /* do something */ });
anObject.subscribeToEvent(eventFoo, function() { /* do something else */ });
Run Code Online (Sandbox Code Playgroud)
这通常比区分回调中的用例更优雅.现在可以在Objective-C中使用块来执行类似的操作(参见Mike Ash的教程).
| 归档时间: |
|
| 查看次数: |
4030 次 |
| 最近记录: |