小编Joh*_*her的帖子

在NSUserDefaults中存储NSDate的最佳方法是什么?

我在NSUserDefaults中存储了两种存储NSDate的方法.

选项1 - setObject:forKey:

// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];

// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
Run Code Online (Sandbox Code Playgroud)

选项2 - timeIntervalSince1970

// Set
NSDate *myDate = [NSDate date];
NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"];

// Get
NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval];
Run Code Online (Sandbox Code Playgroud)

优点和缺点

选项1

这似乎是紧凑和合乎逻辑的.但是,由于Date Formatter错误,我担心这会出错.

选项2

这似乎很笨拙.我也不确定它的准确性 - 在我做过的一次测试中,当我检索到日期时它已经超过了48秒,尽管Apple Docs说NSTimeInterval具有"亚秒精度".

要求

无论我选择何种方法,都必须:

  1. 精确到一秒钟之内.

  2. 可读且可靠.

我的问题

选项2是不准确的,因为我做错了什么?

你会使用这两个选项中的哪一个?

还有其他选择我不知道吗?

谢谢!

cocoa datetime nsdate nsuserdefaults nstimeinterval

172
推荐指数
3
解决办法
5万
查看次数

如何在Ruby代码中追踪内存泄漏?

我在rake任务中调试内存泄漏.我想看一个调用堆栈:

  • 生物
  • 最初分配这些对象的对象或行

红宝石教授可以吗?

如果没有,我应该使用什么工具?

建立

宝石

耙任务

  • 使用DATA LOAD INFILE和Active Record对象将CSV文件直接导入MySql数据库.

我试过的

我试过这些模式

  • RubyProf ::拨款
  • RubyProf :: MEMORY

它在文档中说的全部是:

RubyProf :: ALLOCATIONS对象分配报告显示程序中每个方法分配的对象数.

RubyProf :: MEMORY内存使用情况报告显示程序中每个方法使用的内存量.

这意味着ruby-prof只报告对象的总分配,而不仅仅是生活对象的分配.

我尝试过Ruby-MassBloat Check,但似乎都没能做到我想要的.Ruby-Mass也崩溃,因为它出于某种原因在内存中找到FactoryGirl对象......

ruby memory memory-leaks ruby-on-rails ruby-prof

30
推荐指数
3
解决办法
2万
查看次数

使用命令行Vim与GUI Vim的原因

背景

我正在构建一个应用程序,它可以从文件系统中检测您正在使用的文档.为此,它必须访问活动窗口的AXDocument属性.MacVim提供了此功能.在终端中运行Vim不会提供此功能.

我刚刚发布了一项调查,询问对我的应用程序使用感兴趣的编辑程序员.很多使用Vim的人都直接从命令行使用它.

为什么不使用GUI Vim?

为什么有些人喜欢以这种方式运行Vim而不是像MacVim这样的GUI实现?

这提供了什么优势?据我了解,您可以从命令行将文件发送到MacVim,就像命令行Vim一样容易.

macos vim editor macvim

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

在Rails 3应用程序中关闭ip欺骗检查

问题

我收到错误:

ActionDispatch::RemoteIp::IpSpoofAttackError (IP spoofing attack?!HTTP_CLIENT_IP="203.29.78.157"HTTP_X_FORWARDED_FOR="172.20.19.214, 116.50.58.180"):

当有些人访问我的Rails 3.0.10应用程序并登录或确认他们的电子邮件地址时.我正在使用Devise.

我试过的

http://pivotallabs.com/users/jay/blog/articles/1216-standup-4-7-2010-disabling-rails-ip-spoofing-safeguard

所以在production.rb我补充说:

config.action_controller.ip_spoofing_check = false

我也尝试将其添加到environment.rb:

Things3::Application.configure do
  config.action_mailer.delivery_method = :smtp
  config.action_controller.ip_spoofing_check = false
end
Run Code Online (Sandbox Code Playgroud)

我仍然得到错误.我错过了什么?

configuration environment-variables devise ruby-on-rails-3

15
推荐指数
2
解决办法
7072
查看次数

为什么提出NSException而不是关闭我的应用程序?

问题

我正在编写一个Cocoa应用程序,我想提出异常会使应用程序崩溃.

我的应用程序委托中有以下行:

[NSException raise:NSInternalInconsistencyException format:@"This should crash the application."];
abort();
Run Code Online (Sandbox Code Playgroud)

问题是,他们没有关闭应用程序 - 消息只是记录到控制台,应用程序继续它的快乐方式.

据我了解,例外的全部内容是它们在特殊情况下被解雇.在这种情况下,我希望应用程序以明显的方式退出.这不会发生.

我试过的

我试过了:

-(void)applicationDidFinishLaunching:(NSNotification *)note
    // ...
    [self performSelectorOnMainThread:@selector(crash) withObject:nil waitUntilDone:YES];
}

-(void)crash {
    [NSException raise:NSInternalInconsistencyException format:@"This should crash the application."];
    abort();
}
Run Code Online (Sandbox Code Playgroud)

哪个不起作用

-(void)applicationDidFinishLaunching:(NSNotification *)note
    // ...
    [self performSelectorInBackground:@selector(crash) withObject:nil];
}

-(void)crash {
    [NSException raise:NSInternalInconsistencyException format:@"This should crash the application."];
    abort();
}
Run Code Online (Sandbox Code Playgroud)

相当令人困惑的是,它按预期工作.

这是怎么回事?我究竟做错了什么?

crash cocoa multithreading exception raise

10
推荐指数
2
解决办法
6624
查看次数

当我修改NSOperation子类中的核心数据关系时,为什么我的应用程序崩溃了?

背景

我有以下对象树:

Name                       Project       
Users                      nil           
  John                     nil            
    Documents              nil           
      Acme Project         Acme Project    <--- User selects a project
        Proposal.doc       Acme Project  
          12:32-12:33      Acme Project  
          13:11-13:33      Acme Project  
            ...thousands more entries here...
Run Code Online (Sandbox Code Playgroud)
  • 用户可以将组分配给项目.所有后代都设置为该项目.

  • 这会锁定主线程,所以我正在使用NSOperations.

  • 我正在使用Apple批准的方式来执行此操作,观察NSManagedObjectContextDidSaveNotification并合并到主要环境中.

问题

我的保存失败,出现以下错误:

Failed to process pending changes before save. The context is still dirty after 100 attempts. Typically this recursive dirtying is caused by a bad validation method, -willSave, or notification handler.

我试过的

我已经剥离了我的应用程序的所有复杂性,并做了我能想到的最简单的项目.并且错误仍然存​​在.我试过了:

  • 将队列上的最大操作数设置为1或10.

  • refreshObject:mergeChanges:在NSOperation子类中的几个点调用.

  • 在托管对象上下文中设置合并策略.

  • 建立和分析.它空洞了.

我的问题

如何在没有我的应用程序崩溃的情况下在NSOperation中设置关系?当然这不能限制核心数据?它可以?

代码

下载我的项目: …

cocoa multithreading core-data nsoperation

10
推荐指数
1
解决办法
2158
查看次数

当我正确链接框架时,为什么会收到"_OBJC_CLASS _ $ ...,引自:"链接器错误?

我的问题

我在编译一些Xcode项目时遇到了"_OBJC_CLASS _ $ ...,引用自:"链接器错误(它发生在iOS和Mac项目中)我已正确链接框架和导入.

建立

  • 一个应用目标
  • 一个测试目标
  • 所有框架都正确链接

在编译时,我得到以下链接器错误:"_ OBJC_CLASS _ $ _ JGCountdownTimer",引自:JGCountdownTimerTestCase.o中的objc-class-ref

对于测试中使用的许多类.

我试过的

  • 检查进口是否全部存在
  • 删除了所有非标准框架
  • 如果我为测试目标和应用程序目标编译一个类,它就可以解决问题.但后来我从编译器得到了其他警告.

xcode linker compiler-errors objective-c

10
推荐指数
2
解决办法
3万
查看次数

使用NSError检查错误的正确结构

我正在编写各种例程,我正在尽力保持整洁和重构.

我正在创建的方法开始看起来与此代码类似:

-(IBAction)buttonPress:(id)sender {
    // Create Document Shopping List with this document
    [self doSomething:&error];

    if(error) {
        [NSApp presentError:&error];
        return nil;
    }

    [self doSomethingElse:&error];

    if(error) {
        [NSApp presentError:&error];
        return nil;
    }

    [self doYetSomethingElse:&error];

    if(error) {
        [NSApp presentError:&error];
        return nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢NSError,但这似乎是处理我所有错误的非常笨拙的方式.

我对替代方法的一些想法:

a)错误检查可以内置到doSomething,doSomethingElse等方法中,但是如果不对返回值进行某种检查,我将无法退出按钮按下方法,这会导致我回到类似的结构.

b)我可以将NSError设置为观察到的键值,但是关于这一点的东西感觉非常错误.我非常清楚KVO滥用的可能性,所以我试图在没有它的情况下做任何事情.

当然我错过了一些非常基本的东西吗?有没有一种模式可以帮助我?或者这个结构好吗?

oop error-handling cocoa objective-c

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

如何使用NSDistributedNotifications在进程之间共享Core Data存储?

背景

我已经发布了一个关于在进程之间共享Core Data存储的基础知识的问题.

我正在尝试实施给出的建议,但我遇到了问题.

我的目标

我有两个过程 - 帮助应用程序和UI.它们共享一个数据存储.当Helper App将新数据保存到商店时,我希望UI更新它的NSManagedObjectContext.

当前的计划流程

  1. Helper App Process将数据写入Store.

  2. 在Helper App中,我监听NSManagedObjectContextDidSaveNotification通知.

  3. 保存上下文后,我使用它们的URI表示和NSArchiver对插入,删除和更新的对象进行编码.

  4. 我将NSNotification发送到NSDistributedNotificationCenter,并将此编码字典作为userInfo发送.

  5. UI进程正在侦听保存通知.收到通知后,它会使用NSUnarchiver取消归档userInfo.

  6. 它从给定的URI中查找所有更新/插入/删除的对象,并用NSManagedObjects替换它们.

  7. 它使用更新/插入/删除的对象构造NSNotification.

  8. 我在UI进程的托管对象上下文中调用mergeChangesFromContextDidSaveNotification:传入我在上一步中构建的NSNotification.

问题

插入的对象出现在UI管理对象上下文中,并且它们出现在UI中.问题来自更新的对象.他们只是不更新​​.

我试过的

  1. 最明显的尝试是将Helper App流程中的保存通知传递给UI流程.容易,对吗?好吧,不.分布式通知将不允许我这样做,因为userInfo字典的格式不正确.这就是我正在做所有NSArchiving的原因.

  2. 我已经尝试调用要更新的NSManagedObjects上的refreshObject:mergeChanges:YES,但这似乎没有任何效果.

  3. 我已经尝试在主线程和当前线程上执行mergeChangesFromContextDidSaveNotification:selector.似乎都没有影响结果.

  4. 我尝试过使用mergeChangesFromContextDidSaveNotification:在线程之间,这当然要简单得多,而且效果很好.但我需要在进程之间使用相同的功能.

备择方案?

我在这里错过了什么吗?我一直觉得我做的比现在要复杂得多,但是经过多次阅读文档并花了几天时间,我看不出任何其他方式来刷新MOC用户界面.

有更优雅的方式吗?或者我只是在我的代码中某处犯了一个愚蠢的错误?

代码

我试图尽可能让它变得可读,但它仍然是一团糟.抱歉.

帮助应用程序代码

   -(void)workerThreadObjectContextDidSave:(NSNotification *)saveNotification {
        NSMutableDictionary *savedObjectsEncodedURIs = [NSMutableDictionary dictionary];
        NSArray *savedObjectKeys = [[saveNotification userInfo] allKeys];

        for(NSString *thisSavedObjectKey in savedObjectKeys) {
            // This is the set of updated/inserted/deleted NSManagedObjects.
            NSSet *thisSavedObjectSet = [[saveNotification userInfo] objectForKey:thisSavedObjectKey];
            NSMutableSet *thisSavedObjectSetEncoded = [NSMutableSet set];

            for(id thisSavedObject in [thisSavedObjectSet allObjects]) …
Run Code Online (Sandbox Code Playgroud)

cocoa ipc core-data

8
推荐指数
1
解决办法
2358
查看次数

核心数据迁移问题:"持久存储迁移失败,缺少源管理对象模型."

的背景

  • 包含两个托管对象模型的Cocoa非文档核心数据项目.
  • 模型1保持不变.模型2已更改,因此我想迁移商店.
  • 我在Xcode中通过Design> Data Model> Add Model Version创建了一个新版本.
  • 版本之间的区别是单个关系,从一个关系变为一个关系.
  • 我对模型进行了更改,然后保存了.
  • 我制作了一个新的映射模型,它将旧模型作为源,将新模型作为目标.
  • 我已经确保所有映射模型和数据模型正在编译,并且所有映射模型和数据模型都被复制到我的应用程序包的Res​​ource文件夹中.
  • 我通过在添加持久存储时使用NSMigratePersistentStoresAutomaticallyOption 密钥传入字典来启用迁移 [NSNumber numberWithBool:YES].
  • 我没有合并捆绑中的所有模型,而是指定了我想要使用的两个模型(模型1和模型2的新版本)并使用它们合并它们 modelByMergingModels:

问题

无论我做什么迁移,我都会收到错误消息:

"持久存储迁移失败,缺少源管理对象模型."

我试过的

  • 每次构建后都会清理干净.
  • 我已经尝试了各种组合,只有我在资源中迁移的模型,正在编译或两者兼而有之.
  • 由于错误消息暗示它无法找到我的迁移的源模型,因此我尝试在Resources文件夹中编译每个版本的模型.
  • 通过切换回我的数据模型的原始版本,我已经确定我没有做出一个非常基本的错误.该应用运行正常.
  • 我删除了映射模型和模型的新版本,清理后再重新创建.
  • 我尝试在新模型中进行不同的更改 - 删除实体.

我的智慧结束了.

我不禁想到我在某个地方犯了一个很大的错误,我没有看到.有任何想法吗?

migration cocoa core-data objective-c mapping-model

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