小编Giu*_*ppe的帖子

核心数据合并两个托管对象上下文

我的Cocoa/Application在主线程上有一个托管对象上下文.当我需要更新我的数据时,我的程序将:

  1. 开始一个新的主题
  2. 从服务器接收新数据
  3. 创建新的托管对象上下文
  4. 向主线程发送通知以合并两个上下文

这是在主线程上接收通知的函数

- (void)loadManagedObjectFromNotification:(NSNotification *)saveNotification
{
    if ([NSThread isMainThread]) {
        [self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
    } else {
        [self performSelectorOnMainThread:@selector(loadManagedObjectFromNotification:) withObject:saveNotification waitUntilDone:YES];     
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误.我的问题是合并结果,它实际上连接了两个上下文中的Managed Objects.

我的实体是一个非常简单的属性和关系列表.

也许合并需要一些指令,以便了解更新的托管对象何时不是新的,而是第一个的编辑版本.我想在某个地方我需要指定一种方式来单义地识别实体,(例如,属性可以像ID一样)和类似合并策略的东西(如果2个被管理对象代表同一个对象,请使用lastModificationDate更多)最近).

我只需要了解如何正确合并2个上下文,以便为每个对象创建一个更新的副本.

更新1

这个问题现在对我来说很清楚了.2上下文有很大的不同:ObjectID.当主线程上的上下文使用持久存储协调器获取ManagedObjects时,第二个线程通过获取远程URL来创建这些对象.即使对象具有相同的内容,它们也将具有2个不同的objectID.

我的对象已经有一个唯一的标识符,我可以使用setObjectId来设置这个值.(Apple文档说这不是一个好主意).

cocoa core-data objective-c nsmanagedobject nsmanagedobjectcontext

22
推荐指数
1
解决办法
2万
查看次数

如何在为OCMock对象调用isKindOfClass时获取模拟值?

将OCMock对象传递给函数调用isKindOfClass的方法.但是对于单元测试,返回的值不是模拟类,而是OCMockObject

unit-testing mocking objective-c ocmock

12
推荐指数
1
解决办法
685
查看次数

如何使用doxygen记录Objective-C块?

我正在研究基于doxygen文档的项目,我无法弄清楚如何记录块.让我们设想一个带有块作为回调的异步函数

- (void)startWithCompletionBlock:(void (^)(BOOL success, NSError *error))block;
Run Code Online (Sandbox Code Playgroud)

如何记录这个参数?

documentation doxygen objective-c objective-c-blocks

11
推荐指数
1
解决办法
1204
查看次数

带搜索标题的UICollectionView和Pull to Refresh

我们的想法是在UICollectionView中有一个搜索视图,并且仍然可以使用UIRefreshControl来刷新.在用户向下滚动UICollectionView之前,搜索和UIRefreshControl将不可见.

------------------
| Pull To Refresh |
------------------
|      Search     |
------------------    <--- Above of this line the content is hidden
|    A   |   B    |
------------------
|    C   |   D    |
------------------
|     Footer      |
------------------
Run Code Online (Sandbox Code Playgroud)

我已经尝试将SearchView实现到UICollectionView的节头中,但是这样我就不能使用reloadData,而集合视图的单元格是第一个响应者.

一个好的解决方案应该可以:

  • 用户在搜索框中键入时更新CollectionView数据源
  • 不要弄乱UIRefreshControl的动画

objective-c ios uicollectionview

9
推荐指数
1
解决办法
1323
查看次数

NSArrayController上的SelectionIndexes只返回一个值

我有一个NSCollectionView,其内容由NSArrayController处理.NSCollectionView是可选择的,我需要检索所选元素的列表.我正在尝试观察NSArrayController"selectionIndexes"的关键属性,但它只返回我总是CollectionView中第一个元素的值而不是所选项.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
        //True if in the array controller of the collection view really exists at least a selected object
        if([[arrayController selectedObjects] count] > 0)
        {
            NSLog(@"Selected objects: %@", [arrayController selectedObjects]);
        }
        else
        {
            NSLog(@"Observer called but no objects where selected.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

我永远不会调用这个方法,如果我手动调用NSLog(@"Selected objects:%@",[arrayController selectedObjects])我得到这个

结果总是这样的

结束更新

2011-07-05 20:44:45.711 collectionView2[2153:903] Selected objects 1: (
    "<Hormiga: 0x10013e330>"
)
Run Code Online (Sandbox Code Playgroud)

我想我已经做了一些错误的NSArrayController与NSCollectionView绑定.可能是我的错?告诉我如果你想要更多信息,我甚至可以在你需要的时候以邮政编码发布整个程序.

更新2

这是我在我的控制器中用来观察arrayController"selectionIndexes"键的代码.

[arrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];
Run Code Online (Sandbox Code Playgroud)

更新3

其中一个问题是修复的,我忘了在NSArrayController和NSCollectionView之间设置相对于键"selectionIndexes"的绑定.现在我可以手动检索selectedObject列表及其正确! …

macos cocoa objective-c key-value-observing cocoa-bindings

6
推荐指数
1
解决办法
4548
查看次数

GCovr不会生成有效的报告

我想用Cobertura设置我的Jenkins来跟踪代码覆盖率.不幸的是我无法生成有效的xml.

我正在使用:

  • gcovr 2.5-prerelease(r2774)
  • Xcode 4.6.1构建版本4H512

我的项目正确生成代码覆盖文件,但使用gcovr创建的报告没有用.

我用来生成报告的命令是:

gcovr -r /Users/Shared/Jenkins/Home/jobs/CodeCoverage/workspace 
--object-directory /Users/Shared/Jenkins/Home/Library/Developer/Xcode/DerivedData/myProject-aooceqwwovrizceerghqvhflcfty//Build/Intermediates/myProject.build/Development/myProject.build/Objects-normal/x86_64 
--exclude '.*Developer.*' 
--exclude '.*Tests.*' 
--xml
Run Code Online (Sandbox Code Playgroud)

这将创建我的输出:

<?xml version="1.0" ?>
<!DOCTYPE coverage SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
<coverage branch-rate="0.0" line-rate="0.0" timestamp="1364322914" version="gcovr 2.5-prerelease (r2774)">
<sources>
    <source>
        /Users/Shared/Jenkins/Home/jobs/CodeCoverage/workspace/Project/myProject/
    </source>
</sources>
<packages/>
</coverage>
Run Code Online (Sandbox Code Playgroud)

其他信息:

如果我删除--object-directory和-r然后我从派生数据目录执行命令,则会生成一个有效的报告.此报告可以从cobertura中读取,但不能显示有关源文件的任何详细信息.

code-coverage cobertura objective-c jenkins gcovr

5
推荐指数
1
解决办法
5760
查看次数

Objective C NSLock:在不同的线程上锁定和解锁NSLock

我需要在创建异步请求之前设置一个互斥锁,然后在另一个线程上的此请求的回调中解锁互斥锁.

Apple文档说:

警告:NSLock类使用POSIX线程来实现其锁定行为.向NSLock对象发送解锁消息时,必须确保从发送初始锁定消息的同一线程发送消息.从其他线程解锁锁定可能导致未定义的行为.

如何避免这种"未定义的行为"并使其按预期工作?

macos cocoa multithreading objective-c thread-safety

4
推荐指数
2
解决办法
3464
查看次数

如何从NSCollectionView中检索NSCollectionViewItems

我刚刚实现了一个NSCollectionView,就像在开发者页面上描述的那样,它可以很好地工作.

现在,我如何从CollectionView访问collectionViewItems?

cocoa objective-c cocoa-bindings

4
推荐指数
1
解决办法
1425
查看次数