我在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
好的,所以我在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) 我觉得array[index]应该返回一个可选的,因为索引可能超出范围.
这将允许代码,如:
if let object = array[index] {
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
使用扩展方法很容易做到这一点,但知道这种情况的真正原因将是很好的.
我是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)
但我希望每张脸都有不同的颜色.我怎么做?
我正在将已弃用的通讯簿框架中的应用程序迁移到新的"联系人框架".该应用程序使用ABAddressBookRegisterExternalChangeCallback时,另一个应用程序更改联系人通知.
我无法在Contacts Framework中找到相同的功能.苹果文件说,将使用与默认通知中心的CNContactStoreDidChangeNotification通知:
在另一个更改发生时发布通知
CNContactStore.
根据Apple的建议,我的代码如下:
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "contactsChanged:",
name: CNContactStoreDidChangeNotification,
object: nil)
Run Code Online (Sandbox Code Playgroud)
但是,我发现这种方法存在两个问题:
如果我在我的应用程序中进行更改时记录通知的调试描述,我会得到如下内容:
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?
我尝试从新的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来运行这些示例?
我试图让在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) 我正在测试我的应用程序以发布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) 有谁知道如何"快照"一个完整的SKView或SKScene一个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)
但如何做到这一点上Cocoa有NSImage?救命.
关于Core Data中关系的删除规则是如何工作的,我有点模糊,至少超出了文档中描述的简单情况.
大多数情况,以及我在这里看到的问题的大多数答案都使用了一个模型,其中一对多关系左侧的对象"拥有"右侧的对象:例如a Personhas PhoneNumbers,如果删除该人,则删除所有相关联的号码.在这种情况下,解决方案很明确:如果您设置如下关系,Core Data将为您处理所有事情:
Person --(cascade)-->> PhoneNumber
PhoneNumber --(nullify)--> Person
Run Code Online (Sandbox Code Playgroud)
我感兴趣的是相反的情况:"所有权"相反的多对多关系.例如,我可能会扩展CoreDataBooks示例代码以添加Author实体,以便在一个位置收集有关唯一作者的所有信息.A Book有一位作者,但作者有很多书...但我们并不关心我们没有列出书籍的作者.因此,不应该允许删除Author其books关系为非空的,并且删除Book引用特定的最后一个Author应删除该关系Author.
我可以设想手动执行此操作的几种方法......我不确定的是:
swift ×6
ios ×5
libdispatch ×2
macos ×2
objective-c ×2
swift3 ×2
animation ×1
cncontact ×1
cocoa ×1
cocoa-touch ×1
core-data ×1
coreml ×1
ios8 ×1
metal ×1
reset ×1
scenekit ×1
scnnode ×1
skview ×1
sprite-kit ×1
xcode ×1