小编ric*_*ter的帖子

如何在Swift 3,Swift 4及更高版本中dispatch_sync,dispatch_async,dispatch_after等?

我在Swift 2.x(甚至1.x)项目中有很多代码,如下所示:

// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    dispatch_async(dispatch_get_main_queue()) {
        self.imageView.image = image
    }
}
Run Code Online (Sandbox Code Playgroud)

或者像这样的东西来延迟执行:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
    print("test")
}
Run Code Online (Sandbox Code Playgroud)

或者Grand Central Dispatch API的各种其他用途......

现在我已经在Swift 3的Xcode 8(beta)中打开了我的项目,我得到了各种各样的错误.其中一些提供修复我的代码,但并非所有修复产生工作代码.我该怎么办?

libdispatch grand-central-dispatch dispatch-async swift swift3

230
推荐指数
6
解决办法
18万
查看次数

Swift 3中的dispatch_once是哪一个?

好的,所以我在Xcode 8中发现了新的Swifty Dispatch API.我很开心使用DispatchQueue.main.async,我一直在浏览DispatchXcode中的模块以找到所有新的API.

但我也用它dispatch_once来确保像单例创建和一次性设置这样的事情不会被多次执行(即使在多线程环境中)......并且dispatch_once在新的Dispatch模块中找不到它?

static var token: dispatch_once_t = 0
func whatDoYouHear() {
    print("All of this has happened before, and all of it will happen again.")
    dispatch_once(&token) {
        print("Except this part.")
    }
}
Run Code Online (Sandbox Code Playgroud)

libdispatch grand-central-dispatch swift swift3

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

有没有理由为什么array [index]不返回可选项?

我觉得array[index]应该返回一个可选的,因为索引可能超出范围.

这将允许代码,如:

if let object = array[index] {
  // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

使用扩展方法很容易做到这一点,但知道这种情况的真正原因将是很好的.

swift

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

SCNBox每个面上都有不同的颜色或纹理

我是iOS开发的新手,我自己也很难过.我正在尝试使用每个面具有不同颜色的SceneKit渲染立方体.

这是我到目前为止所得到的:

func sceneSetup() {
    // 1
    let scene = SCNScene()

    // 2
    let BoxGeometry = SCNBox(width: 0.9, height: 0.9, length: 0.9, chamferRadius: 0.0)

    BoxGeometry.firstMaterial?.diffuse.contents = UIColor.redColor()
    let cube = SCNNode(geometry: BoxGeometry)
    cube.position = SCNVector3(x: 0, y: 0, z: -1)
    scene.rootNode.addChildNode(cube)

    // 3
    sceneView.scene = scene
    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true
Run Code Online (Sandbox Code Playgroud)

但我希望每张脸都有不同的颜色.我怎么做?

ios scenekit swift scnnode

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

Contact Framework等效于ABAddressBook.ABAddressBookRegisterExternalChangeCallback

我正在将已弃用的通讯簿框架中的应用程序迁移到新的"联系人框架".该应用程序使用ABAddressBookRegisterExternalChangeCallback时,另一个应用程序更改联系人通知.

我无法在Contacts Framework中找到相同的功能.苹果文件说,将使用与默认通知中心CNContactStoreDidChangeNotification通知:

在另一个更改发生时发布通知CNContactStore.

根据Apple的建议,我的代码如下:

NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: "contactsChanged:",
    name: CNContactStoreDidChangeNotification,
    object: nil)
Run Code Online (Sandbox Code Playgroud)

但是,我发现这种方法存在两个问题:

  1. 我收到所有更改通知,包括我自己的应用程序所做的更改.
  2. 通知是虚假的 - 我收到许多通知,只需一次更改.

如果我在我的应用程序中进行更改时记录通知的调试描述,我会得到如下内容:

NSConcreteNotification 0x7d3370e0 {name = CNContactStoreDidChangeNotification; userInfo = {
    CNNotificationOriginationExternally = 1;
    CNNotificationSourcesKey =     (
    );
}}
Run Code Online (Sandbox Code Playgroud)

如果更改是在外部进行的:

NSConcreteNotification 0x7bf7a690 {name = CNContactStoreDidChangeNotification; userInfo = {
    CNNotificationOriginationExternally = 1;
    CNNotificationSourcesKey =     (
    );
}}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,没有什么明显可以区分它们.

任何人都可以告诉我如何从联系人框架中获得相同的行为,因为人们可以得到ABAddressBookRegisterExternalChangeCallback

abaddressbook ios swift cncontact cncontactstore

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

找不到QuartzCore/CAMetalLayer.h文件

我尝试从新的Metal API for iOS中查看新的样本.当我下载代码时,在XCode 6 Beta中打开它我收到以下错误消息:

QuartzCore/CAMetalLayer.h file not found
Run Code Online (Sandbox Code Playgroud)

我需要添加一些其他文件还是我错过了其他的东西?Metal API应该在OSX 10.9.3中提供.

是否需要升级到Yosemite 10.10 Beta来运行这些示例?

macos xcode ios metal

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

将Image转换为CVPixelBuffer以进行机器学习Swift

我试图让在2017 WWDC上演示的Apple样本Core ML模型正常运行.我正在使用GoogLeNet来尝试对图像进行分类(请参阅Apple Machine Learning Page).该模型将CVPixelBuffer作为输入.我有一个名为imageSample.jpg的图像,我正用于此演示.我的代码如下:

        var sample = UIImage(named: "imageSample")?.cgImage
        let bufferThree = getCVPixelBuffer(sample!)

        let model = GoogLeNetPlaces()
        guard let output = try? model.prediction(input: GoogLeNetPlacesInput.init(sceneImage: bufferThree!)) else {
            fatalError("Unexpected runtime error.")
        }

        print(output.sceneLabel)
Run Code Online (Sandbox Code Playgroud)

我总是在输出中获得意外的运行时错误,而不是图像分类.我转换图片的代码如下:

func getCVPixelBuffer(_ image: CGImage) -> CVPixelBuffer? {
        let imageWidth = Int(image.width)
        let imageHeight = Int(image.height)

        let attributes : [NSObject:AnyObject] = [
            kCVPixelBufferCGImageCompatibilityKey : true as AnyObject,
            kCVPixelBufferCGBitmapContextCompatibilityKey : true as AnyObject
        ]

        var pxbuffer: CVPixelBuffer? = nil
        CVPixelBufferCreate(kCFAllocatorDefault,
                            imageWidth,
                            imageHeight,
                            kCVPixelFormatType_32ARGB,
                            attributes as …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch machine-learning ios swift coreml

19
推荐指数
2
解决办法
9420
查看次数

更新文本后,动画块将重置为原始位置

我正在测试我的应用程序以发布IOS 8.我注意到在执行动画块之后,如果我更新任何标签的文本,动画将重置.我用一个如下所示的方法运行了一个简单的例子.运行此示例将导致以下结果:

  • 单击myButton第一个时间 - 动画运行,但在更改标签文本时重置.
  • 单击myButton第二次 - 动画运行但不会重置为原始位置.

这似乎是因为标签文本没有改变.如果我完全删除更新文本的行,这也会阻止动画在结束时重置.

我想解决这个问题,以便在方法运行时,可以更新标签文本而无需重置动画.

- (IBAction)move:(id)sender {

[UIView animateWithDuration:0.4 delay:0.0
                 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     self.myButton.center = CGPointMake(200, 300);
                 }completion:^(BOOL finished){

                     if(finished){
                         self.myLabel.text=@"moved";
                     }

                 }];
}
Run Code Online (Sandbox Code Playgroud)

animation reset ios ios8

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

渲染/快照SpriteKit场景到NSImage

有谁知道如何"快照"一个完整的SKViewSKScene一个NSImage

我们已经能够使用textureFromNodeAPI SKTexture从节点及其所有子节点创建.但到目前为止,我们无法找到一种方法将图像数据提取为一个NSImage.我们正在构建一个混合Cocoa/ SpriteKit应用程序,我们需要提取场景的小缩略图.

再次,这似乎可以在iOS(获得a UIImage)使用drawViewHierarchyInRect:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

但如何做到这一点上CocoaNSImage?救命.

macos cocoa objective-c sprite-kit skview

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

核心数据删除规则 - 多对多关系,空时删除

关于Core Data中关系的删除规则是如何工作的,我有点模糊,至少超出了文档中描述的简单情况.

大多数情况,以及我在这里看到的问题的大多数答案都使用了一个模型,其中一对多关系左侧的对象"拥有"右侧的对象:例如a Personhas PhoneNumbers,如果删除该人,则删除所有相关联的号码.在这种情况下,解决方案很明确:如果您设置如下关系,Core Data将为您处理所有事情:

Person      --(cascade)-->> PhoneNumber
PhoneNumber --(nullify)-->  Person
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是相反的情况:"所有权"相反的多对多关系.例如,我可能会扩展CoreDataBooks示例代码以添加Author实体,以便在一个位置收集有关唯一作者的所有信息.A Book有一位作者,但作者有很多书...但我们并不关心我们没有列出书籍的作者.因此,不应该允许删除Authorbooks关系为非空的,并且删除Book引用特定的最后一个Author应删除该关系Author.

我可以设想手动执行此操作的几种方法......我不确定的是:

  • 核心数据是否有办法至少自动完成其中一些,就像关系删除规则一样?
  • 处理这种情况是否有"规范"的首选方式?

core-data objective-c

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