小编Tom*_* C.的帖子

从Core Data实体生成Swift模型

Xcode 8更新:

在Xcode 8中,需要转到Core Data Model Editor和Show the File Inspector.靠近底部是代码生成的选项.选择Swift.

编辑:我找到了从Core Data实体生成Swift模型的解决方案:

在Xcode上:

编辑>创建NSManagedOjbect>单击按钮"下一步">单击"下一步"按钮>选择"Swift"Langage>单击"创建"按钮


我使用Core Data在Xcode 6 beta上创建了一个新的Swift项目,尝试了Swift语言.

当我从Core Data的实体生成模型时,Xcode创建了Objective-C模型.

有没有办法用Core Data生成Swift模型而不是Obejctive-C模型?

谢谢 !

xcode model core-data nsmanagedobject swift

50
推荐指数
3
解决办法
4万
查看次数

如何使用Swift/iOS为人类书写笔画设置动画?

目的

我试图使用从字形生成的UIBezierPath创建人类书写的动画近似.我理解并且我已经阅读了许多与我的相似的UIBezierPath问题(但不一样).我的目标是创建一个近似于执行字符和字母书写的人的外观的动画.

背景

我创建了一个游乐场,用于更好地理解用于动画字形的路径,就好像它们是手工绘制的一样.

Apple CAShapeLayer中的一些概念(strokeStart和strokeEnd)在动画时似乎并没有按预期运行.我认为通常人们倾向于将中风想象成使用书写工具(基本上是直线或曲线).我们认为笔划和填充是一条线,因为我们的书写工具不区分笔画和填充.

但是当动画时,路径的轮廓由线段构成(填充是单独处理的,不清楚如何设置填充位置的动画?).我想要实现的是一个自然的人类书写线/曲线,它显示了一个笔划的开始和结束,以及当动画从头到尾移动时添加的部分.最初看起来很简单,但我认为它可能需要设置填充位置的动画(不确定如何执行此操作),笔划开始/结束(不确定是否需要根据上面提到的动画执行方式的意外警告),以及使用子路径(如何从已知路径重建).

方法1

所以,我考虑过Path(CGPath/UIBezierPath)的想法.每个路径实际上包含构造字形所需的所有子路径,因此可能递归这些子路径并使用CAKeyframeAnimation/CABasicAnimations和显示部分构造的子路径的动画组将是一个很好的方法(尽管每个子路径的填充位置和笔划仍然是需要从头到尾动画?).

这种方法导致了一个精炼的问题:

如果有一个完整的UIBezierPath/CGPath,如何访问和创建UIBezierPath/CGPath(子路径)?

如何使用路径/子路径信息用书写工具绘制填充和描边的动画?(似乎这意味着需要同时为CALayer的strokeStart/strokeEnd,position和path属性设置动画)

注意:

正如人们可以在代码中观察到的那样,我确实拥有从字形获得的完成路径.我可以看到路径描述给了我类似路径的信息.如何获取该信息并将其重新编排为一组数据子路径 人类可写的笔画?

(这里的想法是将点信息转换为人类笔画的新数据类型.这意味着要求算法识别每个填充的起点,斜率,端点和边界)

提示

我在Pleco(一个成功实现类似算法的iOS应用程序)中注意到,每个笔划都由描述人类可写笔画的闭合路径组成.UIBezierPath具有基于连续填充填充的封闭路径.需要一种算法来细化重叠填充以为每个笔画类型创建不同的闭合路径.

Erica Sadun 在github上提供了一组路径实用程序.我没有完全探索这些文件,但它们可能在确定离散笔划时非常有用.

UIBezierPath结构似乎基于连续线段/曲线的概念.在填充的交叉点处出现汇合点,其表示有向路径变化.可以计算曲线/线段的行程/填充角度,并搜索相应汇流点的其他曲线/线吗?(即将一条线段连接在相交填充的间隙上,以产生两条独立的路径 - 假设一条线路拾取了点,并使用新的线段/曲线重新创建了路径)

内省:是否有更简单的方法?我错过了一个关键的API,一本书或更好的方法来解决这个问题吗?

一些替代方法(无用 - 需要加载GIF或闪存)以产生所需的结果:

良好的示例(使用Flash),其中一个表示层显示书写笔划的进展.(如果可能的话,这就是我想要在Swift/iOS中近似的东西) - (alt链接 - 请参阅左边的动画图像)

一个不太好的例子,显示使用渐进路径和填充来近似书写笔划特征(动画不流畅且需要外部资源):

不太好

一个Flash版本 - 我熟悉创建Flash动画,但我不愿意在1000版本中实现这些功能(不要太提及它在iOS上不受支持,尽管我可能还可以转换算法以利用带有css动画的HTML5画布).但是这个思路似乎有点远,毕竟,我想要的路径信息存储在我从提供的字体/字符串中提取的字形中.

方法2

我正在考虑使用基于笔划的字体而不是基于轮廓的字体来获取正确的路径信息(即填充表示为路径的信息).如果成功,这种方法比近似笔画,笔画类型,交叉点和笔画顺序更清晰.我已经向Apple提交了雷达,建议将基于笔划的字体添加到iOS(#20426819).尽管有这些努力,我仍然没有放弃形成一种算法,该算法解决了贝塞尔曲线上的线段和曲线的部分笔划,全笔画,交叉点和汇合点.

基于讨论/答案的最新想法

根据以下任何正在进行的对话和答案,提供以下附加信息.

笔划顺序很重要,大多数语言(本例中为中文)都有明确定义的笔划类型笔划顺序规则,它们似乎提供了一种机制,可根据每个CGPathElement提供的点信息确定类型和顺序.

CGPathApply和CGPathApplierFunction看起来很有希望作为枚举子路径的方法(保存到数组并应用填充动画)

可以将一个蒙版应用于图层以显示子图层的一部分(我之前没有使用过此属性,但看起来如果我可以在子路径上移动可能有助于填充动画的蒙版图层?)

为每个路径定义了大量的点.好像仅使用字形轮廓定义BezierPath.这一事实使得理解交叉填充的开始,结束和结合是消除特定填充的歧义的重要因素.

可以使用其他外部库,以便更好地解决笔划行为.其他技术如Saffron Type System或其衍生产品之一可能适用于此问题域.

仅仅为动画设置动画的最简单解决方案的基本问题是可用的iOS字体是轮廓字体而不是基于笔划的字体.一些商业制造商确实生产基于笔划的字体.如果你有其中一个用于测试,请随意使用操场文件链接.

我认为这是一个常见问题,随着我向解决方案迈进,我将继续更新帖子.如果需要进一步的信息或者我可能遗漏了一些必要的概念,请在评论中告诉我.

面具

可能解决方案

我一直在寻找最简单的解决方案.问题源于字体的结构是轮廓字体而不是基于笔画的字体.我发现了一个基于笔划的字体样本进行测试,并使用它来评估概念证明(见视频).我现在正在寻找扩展的单笔划字体(包括中文字符)以进一步评估.一个不太简单的解决方案可能是找到一种方法来创建一个跟随填充的笔划,然后使用简单的二维几何来评估首先设置动画的笔划(例如中文规则在笔划顺序上非常清晰). …

core-animation cgpath ios uibezierpath swift

36
推荐指数
2
解决办法
3653
查看次数

如何在后台线程(Swift)上有效地将大文件写入磁盘

更新

我已经解决并删除了令人分心的错误.请阅读整篇文章,如果仍有问题,请随时留言.

背景

我试图使用Swift 2.0,GCD和完成处理程序在iOS上将相对较大的文件(视频)写入磁盘.我想知道是否有更有效的方法来执行此任务.在使用完成逻辑的同时,需要在不阻塞主UI的情况下完成任务,并确保尽可能快地执行操作.我有自定义对象与NSData属性,所以我目前正在尝试使用NSData上的扩展.作为示例,替代解决方案可能包括使用NSFilehandle或NSStreams以及某种形式的线程安全行为,这导致比基于当前解决方案的NSData writeToURL函数快得多的吞吐量.

NSData有什么问题吗?

请注意以下从NSData类参考(保存数据)中进行的讨论.我确实对我的临时目录执行写操作,但是我遇到问题的主要原因是我在处理大文件时可以看到UI明显滞后.这种滞后恰恰是因为NSData不是异步的(Apple Docs注意到原子写入会导致"大"文件的性能问题〜> 1mb).因此,在处理大型文件时,无论NSData方法中的内部机制是什么,都可以使用.

我做了一些挖掘,并从Apple发现了这个信息..."这个方法非常适合将数据:// URL转换为NSData对象,也可以用于同步读取短文件.如果你需要读取可能很大的文件,使用inputStreamWithURL:打开一个流,然后一次读取一个文件." (NSData类参考,Objective-C,+ dataWithContentsOfURL).这个信息似乎暗示我可以尝试使用流将文件写在后台线程上,如果将writeToURL移动到后台线程(由@jtbandes建议)是不够的.

NSData类及其子类提供了快速轻松地将其内容保存到磁盘的方法.为了最大限度地降低数据丢失的风险,这些方法提供了以原子方式保存数据的选项.原子写保证数据可以完整保存,也可以完全失败.原子写入从将数据写入临时文件开始.如果此写入成功,则该方法将临时文件移动到其最终位置.

虽然原子写操作可以最大限度地降低因文件损坏或部分写入而导致数据丢失的风险,但在写入临时目录,用户主目录或其他可公开访问的目录时,它们可能不合适.每次使用可公开访问的文件时,都应将该文件视为不受信任且可能存在危险的资源.攻击者可能会破坏或破坏这些文件.攻击者还可以使用硬链接或符号链接替换文件,从而导致写入操作覆盖或损坏其他系统资源.

在可公开访问的目录中工作时,避免使用writeToURL:atomically:方法(以及相关方法).而是使用现有文件描述符初始化NSFileHandle对象,并使用NSFileHandle方法安全地写入文件.

其他替代品

一个物品在objc.io上并发编程提供了有趣的选择"高级:文件I/O在后台".一些选项也涉及使用InputStream.Apple还有一些旧的参考文件,用于异步读取和写入文件.我发布这个问题是为了期待Swift的替代方案.

适当答案的示例

以下是可能满足此类问题的适当答案的示例.(用于流编程指南,写入输出流)

使用NSOutputStream实例写入输出流需要几个步骤:

  1. 使用写入数据的存储库创建并初始化NSOutputStream的实例.还设置了一个代表.
  2. 在运行循环上计划流对象并打开流.
  3. 处理流对象报告给其委托的事件.
  4. 如果流对象已将数据写入内存,请通过请求NSStreamDataWrittenToMemoryStreamKey属性来获取数据.
  5. 当没有更多数据要写入时,丢弃流对象.

我正在寻找最熟练的算法,适用于使用Swift,API或甚至C/ObjC将极大文件写入iOS就足够了.我可以将算法转换为适当的Swift兼容结构.

Nota Bene

我理解下面的信息错误.它包含完整性.这个问题是询问是否有更好的算法用于将大文件写入具有保证依赖序列的磁盘(例如NSOperation依赖).如果有请提供足够的信息(描述/样本为我重建相关的Swift 2.0兼容代码).如果我遗漏任何有助于回答问题的信息,请告知我们.

关于扩展名的说明

我已经在基本writeToURL中添加了一个完成处理程序,以确保不会发生意外的资源共享.我使用该文件的依赖任务永远不会面临竞争条件.

extension NSData {

    func writeToURL(named:String, completion: (result: Bool, url:NSURL?) -> Void)  {

       let filePath = NSTemporaryDirectory() + named
       //var success:Bool = false
       let tmpURL = NSURL( fileURLWithPath:  filePath )
       weak var …
Run Code Online (Sandbox Code Playgroud)

multithreading large-files large-data ios swift

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

Swift替代#pragma clang诊断

问题

我最近在这段代码中的第三方实用程序(WEPopover)中遇到警告:

_effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover;
Run Code Online (Sandbox Code Playgroud)

这产生了以下警告:

warning: 'contentSizeForViewInPopover' is deprecated: first deprecated in iOS 7.0 - Use UIViewController.preferredContentSize instead. [-Wdeprecated-declarations]
            _effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover;
Run Code Online (Sandbox Code Playgroud)

Objective-C中的一个临时修复是使用pragma clang诊断来消除错误(我将让代码作者处理一个真正的修复).所以我修改了代码:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
            _effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover;

#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

哪个工作得很好,但是这让我想一想,如果存在任何替代方案,在Swift编码时需要沉默类似的误报警告?

注意事项

我观察到这样一个事实:我可以在项目范围内停用此类警告(使用Xcode设置),但我想考虑如上所述的内联问题.我还考虑在我的Swift项目中将.define添加到.bridging-header.h文件中并以某种方式利用它; 但是我正在寻找一个针对这个问题的Swift特定解决方案.我确实知道pragma已不再可用,我搜索过SO并发现类似但不重复的问题.

更新的决议:Swift 2.0

提供的答案解决了我对内联警告的担忧.availability命令应该允许完全避免这样的问题,因为在编译时会警告一个问题.

Apple的Swift书明确指出:

"您可以在if或guard语句中使用可用性条件来有条件地执行代码块,具体取决于您要使用的API是否在运行时可用.当编译器验证该"代码块"中的API是否可用时,编译器将使用可用性条件中的信息.

 if #available(iOS 9, OSX 10.10, *) {
 // Use iOS 9 APIs on iOS, and use OS X v10.10 APIs on OS X 
 } else {
 // Fall back …
Run Code Online (Sandbox Code Playgroud)

macros objective-c clang c-preprocessor swift

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

va_list,CVaListPointer,AnyObject ...,CVarArgType有什么区别和用例?

有人可以解释这些论证类型之间的差异吗?此外,如果可能的话,请使用代码提供适当的用例(价值1000字).

Nota bene

如果需要更多信息,请在评论中告诉我.

背景

我试图理解以下结构之间的任何差异,并理解适当的用例(如果有的话,有示例).我搜索过SO,Google等人.(blogosphere)没有找到满意的答案.

在编写数据存储对象时,我遇到了NSPredicate的以下初始化器:

NSPredicate,初始化

Swift头文件(1.2)注意到:

CVaListPointer

博客评论表明Objective-C中va_list的以下用法

+ (void) log:(NSString *) format arguments:(va_list) argList
{
    [self logString: [NSString stringWithFormat: format arguments:
argList]];
}

+ (void) log:(NSString *) format, ...
{
    va_list argList;
    va_start(argList, format);
    {
  [self log: format arguments: argList];
    }
    va_end(argList);
}
Run Code Online (Sandbox Code Playgroud)

CVarArgType是一种协议,可以根据Swift头文件使用如下.

CVarArgType

在我的自定义类中,我有以下用例:

   /*  Finds an array of entity in the MOC if any exists using an optional
    *   predicate with an array of arguments
    *
    *   Usage:
    *   eg. var items = CustomEntity.findInStore(dbStore, predicate: …
Run Code Online (Sandbox Code Playgroud)

objective-c variadic-functions nspredicate swift

14
推荐指数
1
解决办法
4066
查看次数

如何从Swift中的一系列图像中有效地创建多行照片拼贴

问题

我正在构建一系列照片拼贴画,这些照片是我放在桌面视图上的.当图像数量达到tableview单元格宽度的边界时,我想让图像换行(这样我就可以在拼贴中显示图像行).目前我得到一排.如果需要其他信息,请随时告知.我很可能不会以最有效的方式接近这一点,因为随着阵列中使用的图像数量开始增加而存在延迟.(对此的任何反馈将非常感激).

Nota Bene

我正在创建拼贴图像.它实际上是一个图像.我想通过在内存中创建一个有效的列和行矩阵来安排拼贴 .然后我用图像填充这些图像.最后,我对生成的图像进行快照,并在需要时使用它.算法写入效率不高,只产生一行图像.我需要一个轻量级替代下面使用的算法.在这种情况下,我不相信UICollectionView会是一个有用的替代品.

伪代码

  1. 给定一组图像和一个目标矩形(表示目标视图)
  2. 获取阵列中的图像数量与每行允许的最大数量
  3. 定义一个适当大小的较小矩形来保存图像(以便每行填充目标矩形,即 - 如果一个图像然后填充该行;如果是9个图像那么应该完全填充该行;如果10个图像具有最大值每行9个图像然后第10个开始第二行)
  4. 迭代收集
  5. 将每个矩形从左到右放置在正确的位置,直到达到最后一个图像或每行最大数量; 继续下一行,直到所有图像都适合目标矩形
  6. 当达到每行的最大图像数时,放置图像并设置下一个矩形以显示在连续的行上

使用:Swift 2.0

class func collageImage (rect:CGRect, images:[UIImage]) -> UIImage {

        let maxSide = max(rect.width / CGFloat(images.count), rect.height / CGFloat(images.count))

        UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.mainScreen().scale)

        var xtransform:CGFloat = 0.0

        for img in images {
            let smallRect:CGRect = CGRectMake(xtransform, 0.0,maxSide, maxSide)
            let rnd = arc4random_uniform(270) + 15
            //draw in rect
            img.drawInRect(smallRect)
            //rotate img using random angle.
            UIImage.rotateImage(img, radian: CGFloat(rnd))
            xtransform += CGFloat(maxSide * 0.8)
        }

        let …
Run Code Online (Sandbox Code Playgroud)

performance processing-efficiency ios swift

13
推荐指数
1
解决办法
3968
查看次数

Xcode 5构建设置"未使用的功能"实际上做了什么?

Xcode 5有一个名为"Unused Functions"的构建设置.我在其他地方读过"编译器永远无法判断Objective-C方法是否真的未被使用,因为它可以通过performSelector :,通过子类化或许多其他方式动态调用." 鉴于未使用的参数确实显示了未使用的参数,我很惊讶未使用的函数没有隐含的行为.

有人可以解释这个设置的含义/影响吗?

构建设置中的未使用函数

compiler-construction objective-c xcode5

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

在CoreData中保存Swift CLLocation

我正在尝试CLLocation在Core Data中保存数据.我的属性设置为可转换对象.

一些示例代码表明可以使用此objc转换为a来保存位置数据NSValue.

CLLocationCoordinate2D myLocation;
NSValue *locationValue = [NSValue valueWithBytes:&myLocation objCType:@encode(CLLocationCoordinate2D)]
// then put locationValue into storage - maybe an ObjC collection class or core data etc.
Run Code Online (Sandbox Code Playgroud)

从数据存储中检索对象应该可以使用此范例.

CLLocationCoordinate2D myLocation;
NSValue *locationValue = // restored from your database or retrieved from your collection class
[locationValue getValue:&myLocation];
Run Code Online (Sandbox Code Playgroud)

我试图推断这个想法并将整个CLLocation对象捕获到NSValue存储中CoreData,目标CLLocation是稍后从商店中恢复对象.

在测试各种方法时,我发现在尝试CLLocation从Core Data Store中解包对象时返回了nil .我CLLocation使用以下内容将对象放入商店:

//verified that I have a good CLLocation here
newManagedObject.setValue(location as CLLocation, forKey: "location") …
Run Code Online (Sandbox Code Playgroud)

core-data cllocation nsvalue swift

6
推荐指数
2
解决办法
4530
查看次数

如何访问 newData 服务器变量的键?

(如果需要进一步澄清,请参阅修订后的问题和评论)

鉴于此数据结构

{
  "-KWz2G9JKtwqt5Kn-pL7":true
}
Run Code Online (Sandbox Code Playgroud)

当我尝试验证 newData 时,如何从 Firebase 验证规则中访问第一个值(“-KWz2G9JKtwqt5Kn-pL7”)?

请在下面找到我的原始问题。

背景

在线示例表明,连接 Firebase 实体的最佳方式是使用索引,其中收集与另一个实体节点内的一个实体相关的 id。

例如;

"groups":{ 
...
  "members":{
   "userid-1":true, 
   "userid-2":true
   }
 }
Run Code Online (Sandbox Code Playgroud)

我想使用以下数据结构将索引发布到另一个实体(队列/队列/任务)下的节点,并使用以下描述的规则集验证该数据结构:

{
  "-KWz2G9JKtwqt5Kn-pL7":true
}
Run Code Online (Sandbox Code Playgroud)

数据结构是对我想要与单独实体的节点关联的任务实体 (/tasks/task/tid) 的引用。

我计划将这些值放入字典并通过 setValue 添加它。当我这样做时,Firebase 应该应用验证规则。我想验证标识符是否存在于数据库中的其他地方。

我的索引看起来像这样 (其中标识符与存储在另一个位置的一组任务 ID 相关)

"queues":{
....
   "K24395498054-p23"{
     "tasks": {
        "-KWz2G9JKtwqt5Kn-pL7":true,
        "-KWjewrkstwqt7Ln-pL3":true,
        "-KWjewgqjdsllfsn-pL5":true
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是我不清楚如何在规则中解压缩 newData 服务器变量的第一个值,在这种情况下,我没有子标识符。

我没有发送单一值,而是向 Firebase 发送字典。

在这种情况下 newData 应该等于

{
  "-KWz2G9JKtwqt5Kn-pL7":true
}
Run Code Online (Sandbox Code Playgroud)

Nota Bene - 一个有趣的旁注;我正在尝试创建索引,但正在阅读 setValue 文档。它指出该值将被覆盖。那么如何在不覆盖现有值的情况下保存字典?

规则

{
  "rules": {
    ".read": "auth != null",
    "queues": { …
Run Code Online (Sandbox Code Playgroud)

firebase firebase-security firebase-realtime-database

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

如何在没有委托的情况下从UIAlertView完成块访问用户输入?

使用iOS6:

我想将用户输入的文本检索到与UIAlertView关联的UITextField中.我知道我可以通过委托获得期望的结果但是我很好奇用回调函数来解决这个问题,因为我相信这可能是一个有趣的模式.我首先检查了UIAlertView类的类扩展的常见模式.代码如下.在此先感谢您的任何建议.

import <UIKit/UIKit.h>

@interface UIAlertView (Block)
- (id)initWithTitle:(NSString *)title message:(NSString *)message completion:(void (^)(BOOL cancelled,     NSInteger buttonIndex, UITextField *textField))completion cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;

@end
Run Code Online (Sandbox Code Playgroud)

该类别的.m如下:

#import "UIAlertView+Block.h"
#import <objc/runtime.h>


static char const * const alertCompletionBlockTag = "alertCompletionBlock";

@implementation UIAlertView (Block)

- (id)initWithTitle:(NSString *)title
            message:(NSString *)message
         completion:(void (^)(BOOL cancelled, NSInteger buttonIndex))completion
  cancelButtonTitle:(NSString *)cancelButtonTitle
  otherButtonTitles:(NSString *)otherButtonTitles, ... {

self = [self initWithTitle:title message:message delegate:self cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil ];


if (self) {
    objc_setAssociatedObject(self, alertCompletionBlockTag, completion, OBJC_ASSOCIATION_COPY);

    va_list _arguments;
    va_start(_arguments, otherButtonTitles);

    for (NSString …
Run Code Online (Sandbox Code Playgroud)

uitextfield uialertview objective-c-blocks objective-c-category ios6

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