"上下文"在Cocoa/Objective-c中意味着什么?

nev*_*ing 4 cocoa objective-c

最近我在Cocoa中看到了方法名称中使用的"context"一词,但我不明白其含义.我已经看到了它在像核心数据(的地方NSManagedObjectContext)和核芯显卡(CGBitmapContextCreate),但它似乎是各地(用NSSet,NSArray,NSObject).我假设它来自c世界.

他们在谈论这个背景是什么?

Rob*_*ger 8

这只是术语,你提到的背景是无​​关的.单词上下文通常用于描述特定的"工作空间".

例如,a CGContextRefNSGraphicsContext存储可以执行绘图操作的图形空间.

NSManagedObjectContext存储NSManagedObjects特定持久性商店的"工作集" .

每个API的文档都详细描述了每个上下文的内容.

  • 对于CoreGraphics和图形子系统,一般情况下,记住图形卡是状态机是有帮助的.显然,您的应用程序需要能够假设图形子系统处于什么状态(并在必要时存储/恢复).这种假设可以被认为是"操作环境". (3认同)

zou*_*oul 5

没有特别的意义,但有两个常见的含义.

第一个是与数据库,持久层,图形和这样的野兽连接,你需要一些"范围","连接"或"状态"的概念.例如,在将数据保存到数据库时,通常需要打开数据库,然后保存一些数据库'句柄',您将在后续操作中参考.可以有许多不同的连接,因此有许多不同的"手柄".换句话说,可以存在许多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的教程).