小编Nic*_*ing的帖子

Xcode 4中的NSPredicateEditor

Xcode 4的谓词编辑器控件存在一些问题 - 我认为我做的一切都是正确的,而且看起来IDE本身就被破坏了.

我在我正在编写的应用程序中遇到此问题,但为了隔离它,我执行了以下操作:

使用窗口创建新项目.在XIB编辑器中,向其添加NSPredicateEditor,并添加一行.将其保留为关键路径/字符串,并添加两个关键路径 - "标题"和"编写者".使它成为案例和变音不敏感.

创建NSWindowController的子类并为谓词编辑器添加IBOutlet.

在awakeFromNib中,输入以下代码:

NSPredicate*myPredicate = [NSPredicate predicateWithFormat:@"(标题CONTAINS [CD]%@)AND(作者CONTAINS [CD]%@)",@"",@""];

[_predicateEditor setObjectValue:myPredicate];

这会在控制台中产生以下内容:

2011-04-12 15:59:37.709 PredicateTest [38419:903]警告 - 无法找到模板匹配谓词标题CONTAINS [cd]""

2011-04-12 15:59:37.710 PredicateTest [38419:903]警告 - 无法找到模板匹配谓词作者CONTAINS [cd]""

当我单击(+)按钮添加新行时,我得到以下内容:

2011-04-12 15:59:40.044 PredicateTest [38419:903]无法使用nil运算符或表达式创建比较谓词.

我是否正确地认为我在这里做错了什么,这应该有用吗?如果我更改谓词编辑器行模板远离键路径,然后将其切换回键路径,并编辑键路径列表,Xcode崩溃与内部一致性异常,这让我觉得Xcode 4可能不符合要求它涉及到谓词编辑.

有人有任何想法吗?我已经尝试在代码而不是XIB编辑器中创建NSPredicateEditor,并且无休止地搞乱无济于事.谓词编辑功能正在阻止我向商店发布应用程序,所以这有点令人烦恼.

macos cocoa objective-c nspredicateeditor xcode4

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

在NSOperationQueue中命名线程

NSOperationQueue创建了许多线程,正如您所期望的那样.但是当您暂停应用程序并在Xcode中调试它时,不清楚哪些线程属于一个操作队列,哪些线程属于另一个操作队列.

我试过了:

[NSThread currentThread] setName: @"My amazing operation thread"]
Run Code Online (Sandbox Code Playgroud)

但是当线程被重用时,这只意味着许多线程获得此名称,然后永远不会丢失它.我试过设置在线程名称-start和它解封-finish,但该线程的名字在Xcode调试线程列表从未露面.

命名线程/操作以使它们在Xcode中更容易调试的好方法是什么?

objective-c nsoperation nsthread nsoperationqueue

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

Fastlane/CircleCI 上的 UI 测试失败,因为没有在新的模拟器上设置位置

目前我们的测试失败了,因为当授予位置权限时,我们永远不会进入下一个屏幕,因为位置更新永远不会发生。

这是因为使用 Fastlane 设置的新模拟器实例不会设置位置。app 目标方案指定了默认位置,UI 测试目标也是如此;两者都没有受到尊重。当从 Xcode 运行测试时,位置确实会得到尊重,而不是当模拟器从命令行激活时,因为模拟器应用程序从未真正打开过,只是存在,由终端拥有但不可见。测试套件上的位置也已设置。

当模拟器以不可见的方式运行时,如何在脚本中设置模拟器的位置?

我发现了这个:https : //github.com/lyft/set-simulator-location

它需要这个脚本:

# download set-simulator-location
brew install lyft/formulae/set-simulator-location

# run simulator
export IOS_SIMULATOR_UDID=`instruments -s devices | grep "iPhone 6 (10.3) \[" | awk -F '[ ]' '{print $4}' | awk -F '[\[]' '{print $2}' | sed 's/.$//'`
echo $IOS_SIMULATOR_UDID
open -a "simulator" --args -CurrentDeviceUDID $IOS_SIMULATOR_UDID

# wait simulator to start fully
sleep 15

# set location
set-simulator-location -q London
Run Code Online (Sandbox Code Playgroud)

但它看起来很笨重,需要硬编码特定的模拟器然后打开它,等待 15 秒,然后在上面设置位置。我觉得一定有更好的方法。

xcode circleci xcode-ui-testing fastlane

5
推荐指数
0
解决办法
489
查看次数

嵌套的UIScrollviews表现得很奇怪

我有以下自动布局驱动设置:

  • 主viewController,里面有一个scrollview.Scrollview固定到superview边缘.这个向上和向下滚动.在scrollview顶部有一些正常的固定大小的视图

  • 另一个scrollview.这个向左和向右滚动.第二个scrollview包含几个tableviews,并排.这个想法是用户可以在它们之间切换.它们都包含一些细胞,宽度与屏幕相同,高72pts.

我试图解决的问题是tableview内容的大小不同.左边有6个单元格,右边有3个单元格.

我的第一种方法是动态更改第二个scrollview高度,以匹配当前可见的tableview.最终发生的事情是,如果动画设置为true,那么在两个tableviews之间切换(通过执行setContentOffset:animated :)会出现极大错误 - 它会调整内容偏移,因此一切都在屏幕外.实际上它会将内容偏移设置为,然后当我切换时,大约十几次,然后重置.这很奇怪,我放弃了.

现在我试图调整主滚动视图的内容插入以抵消当前tableview内容的差距,这也很奇怪.当我在viewDidLoad中设置底部内容插入时,它工作正常.当我在tableview变为当前时设置它时,它什么都不做.

是什么赋予了?哪些情况会导致这些视图交互不正常?

uitableview uiscrollview ios autolayout swift

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

尽管objectID字符串比较工作正常,MagicalRecord + Core Data仍未在上下文之间找到对象

我有一个NSFetchedResultsController,它在核心数据实体"MyGalleryPhoto"上进行查询.

我正在尝试删除一些对象,并遇到一些问题.我正在使用MagicalRecord.这是我对代码的原始尝试,在我看来应该可以正常工作.在代码运行时,对象肯定存在,因为它们显示在fetchedResultsController中.

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

    for (MyGalleryPhoto *myGalleryPhoto in [self.fetchedResultsController.fetchedObjects objectsAtIndexes: self.selectedIndexes]) {

        NSError *error = nil;
        MyGalleryPhoto *localMyGalleryPhoto = (MyGalleryPhoto *) [localContext existingObjectWithID: myGalleryPhoto.objectID error: &error];

        NSLog(@"error: %@:%@", [error localizedDescription], [error userInfo]);
        NSLog(@"mygp: %@", [localMyGalleryPhoto description]);

        [localMyGalleryPhoto deleteInContext: localContext];
    }

} completion:^(void){
}];
Run Code Online (Sandbox Code Playgroud)

此代码不起作用.找不到myGalleryPhoto条目,返回的错误是:"操作无法完成.(Cocoa错误133000.)"我也尝试使用MR_inContext,它只调用existingObjectWithId:error:.

在经历了很多混乱后,我想出了这个卑鄙的弗兰肯斯坦的怪物,它从实体中获取所有记录并比较ObjectID的字符串表示.这很好用.为什么?我正在使用我今天从GitHub下载的MagicalRecord副本,最新的XCode,最新的SDK等等.

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {

    NSArray *allMyGalleryPhotos = [MyGalleryPhoto findAllInContext: localContext];

    for (MyGalleryPhoto *myGalleryPhoto in [self.fetchedResultsController.fetchedObjects objectsAtIndexes: self.selectedIndexes]) {

        MyGalleryPhoto *myGalleryPhotoToDelete = nil;

        for (MyGalleryPhoto *existingMyGalleryPhoto in allMyGalleryPhotos) {

            NSString *existingURLString = [[existingMyGalleryPhoto.objectID URIRepresentation] …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c magicalrecord

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

正确删除核心数据的规则多对多关系?

在我的核心数据模型中,我有一个配置文件实体,其中包含多个多对多关系.其中一个是'寻找'.许多配置文件可以寻找许多不同的东西.

Core Data中的关系将其Delete Rule设置为Nullify.我想要发生的是,当删除个人资料时,所有搜索条目都不受影响,并且当删除搜索条目时,应该从每个人的个人资料中删除它.

这似乎我应该对Profile和Looking For之间关系的两个方向都做不动作,但是从谷歌搜索和阅读文档,我不确定这是否正确,事实上,没有动作似乎是你几乎要做的事情除非你进行大量优化,否则永远不要使用.这是文档:

无操作 对关系目的地的对象执行任何操作.例如,如果您删除某个部门,请将所有员工保持原样,即使他们仍然认为他们属于该部门.

没有使用No Action规则的原因就不那么明显了,因为如果你使用它,你就有可能让对象图处于不一致的状态(员工与被删除的部门有关系).

如果使用"无操作"规则,则需要确保维护对象图的一致性.您有责任将任何反向关系设置为有意义的值.在您具有多对多关系并且目的地可能存在大量对象的情况下,这可能是有益的.

所以我觉得我应该使用Nullify(我目前正在使用),但是Nullify的文档说:

Nullify 将目标对象的反向关系设置为null.例如,如果删除部门,请将所有当前成员的部门设置为null.只有当员工的部门关系是可选的,或者您确保在下一次保存操作之前为每个员工设置新部门时,这才有意义.

现在,正如所写,这似乎意味着如果你删除一个配置文件,那个与该配置文件相关联的每个寻找将与配置文件清空,即从所有配置文件中删除.

在这种情况下,正确的做法是什么?

core-data objective-c

3
推荐指数
1
解决办法
1781
查看次数

这是调试CoreData并发问题的有效方法吗?

像许多iOS开发人员一样,我使用CoreData,就像许多使用CoreData的iOS开发人员一样,我有很难跟踪线程违规错误.我正在尝试实现一个调试策略,以便在CoreData并发规则被破坏时抛出异常.我的尝试在下面 - 我的问题是,这有效吗?它会产生误报吗?

简介:创建NSManagedObject时,请记下该线程.每当稍后访问某个值时,检查当前线程是否与创建线程相同,如果没有,则抛出异常.

#import "NSManagedObject+DebugTracking.h"
#import "NSObject+DTRuntime.h"
#import <objc/runtime.h>
#import "NSManagedObjectContext+DebugThreadTracking.h"

@implementation NSManagedObject (DebugTracking)

+(void)load {

    [NSManagedObject swizzleMethod:@selector(willAccessValueForKey:) withMethod:@selector(swizzled_willAccessValueForKey:)];
    [NSManagedObject swizzleMethod:@selector(initWithEntity:insertIntoManagedObjectContext:) withMethod:@selector(swizzled_initWithEntity:insertIntoManagedObjectContext:)];

}

- (__kindof NSManagedObject *)swizzled_initWithEntity:(NSEntityDescription *)entity
              insertIntoManagedObjectContext:(NSManagedObjectContext *)context
{
    NSManagedObject *object = [self swizzled_initWithEntity:entity insertIntoManagedObjectContext:context];
    NSLog(@"Initialising an object of type: %@", NSStringFromClass([self class]));

    object.debugThread = [NSThread currentThread];
    return object;
}

-(void)swizzled_willAccessValueForKey:(NSString *)key {

    NSThread *thread = self.debugThread;

    if (!thread) {
        NSLog(@"No Thread set");
    } else if (thread != [NSThread currentThread]) {
        [NSException raise:@"CoreData thread violation exception" format:@"Property …
Run Code Online (Sandbox Code Playgroud)

core-data objective-c ios

3
推荐指数
1
解决办法
841
查看次数

UICollectionView在performBatchUpdates上锁定主线程约10秒

我有一个300个单元格的集合视图,由NSFetchedResultsController驱动.每隔一段时间,所有对象都会更新,所以我收到委托消息告诉我,并让集合视图处理更新,就像我查看tableview一样.不幸的是,每次发生这种情况时它会锁定主线程几秒钟......我不知道为什么.这是我的代码:

-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{

    [self.cascadeViewController.collectionView performBatchUpdates:^{

    NSLog(@"performingBatchUpdates");

    for (NSDictionary *change in self.changes) {

        [change enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, id obj, BOOL *stop) {

            NSFetchedResultsChangeType type = [key unsignedIntegerValue];

            if (type == NSFetchedResultsChangeInsert) {

                [self.cascadeViewController.collectionView insertItemsAtIndexPaths:@[obj]];

            } else if (type == NSFetchedResultsChangeDelete) {

                [self.cascadeViewController.collectionView deleteItemsAtIndexPaths:@[obj]];

            } else if (type == NSFetchedResultsChangeUpdate) {

                [self.cascadeViewController.collectionView reloadItemsAtIndexPaths:@[obj]];

            } else if (type == NSFetchedResultsChangeMove) {

                [self.cascadeViewController.collectionView moveItemAtIndexPath:obj[0] toIndexPath:obj[1]];

            }

        }];
    }

    NSLog(@"performingBatchUpdates end");

} completion:^(BOOL finished) {

    NSLog(@"completion");

    // TODO: implement
    //    [self configureMessageAndFooterView];

}];

NSLog(@"end of …
Run Code Online (Sandbox Code Playgroud)

objective-c nsfetchedresultscontroller uicollectionview uicollectionviewlayout

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