这是我的代码:
var handler:FIRDatabaseHandle!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.handler = self.ref.observe(.value, with: {[weak self] (snapshot) in
var _tasks = Array<Task>()
for item in snapshot.children {
let task = Task(snapshot: item as! FIRDataSnapshot)
_tasks.append(task)
}
self?.tasks = _tasks
self?.tableView.reloadData()
})
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
self.ref.removeAllObservers()
}
Run Code Online (Sandbox Code Playgroud)
所以当我离开这个控制器(实际上我退出)时,我会在控制台中看到下一个警告:
[Firebase /数据库] [I-RDB04822]/users/ovLWTmGIPFaF6DaLzrPBBr13 /任务的监听器失败:permission_denied
如果我编写Swift 3代码,它将看起来像这样:
let animation = CABasicAnimation(keyPath: #keyPath(CAShapeLayer.path))
Run Code Online (Sandbox Code Playgroud)
但是我尝试对keyPath使用Swift 4新语法,并且得到了:
let keyPath = \CAShapeLayer.path
let animation = CABasicAnimation(keyPath: keyPath) // error line
Run Code Online (Sandbox Code Playgroud)
>错误:无法将类型“ ReferenceWritableKeyPath”的值转换为预期的参数类型“字符串?”
在这种情况下,如何使用Swift 4使用密钥路径?
我读了几个教程,如何在SceneKit/ARKit应用程序中放置3d对象,所有这些教程都使用.scn格式文件作为对象.
但是我发现如果我使用原始.dae格式并且不将其转换为.scn格式则没有任何问题.
我真的看不到.dae和.scn格式之间的任何区别.
实际上结果在我看来是一样的,但你能解释一下它们之间的差异以及在什么情况下我应该使用什么?
谢谢!
我已经创建了一个searchController,因此我试图使其根据UISearchController中的文本过滤内容。我创建了一个自定义对象,如下所示。我试过使用NSPredicate,但一直得到:
cannot convert value of type NSPredicate to expected type @noescape (organization) throws...
class Organization: Object {
var id: Int = 0
var name: String = ""
var shortName: String = ""
var image: NSData = NSData()
var pinImage: NSData = NSData()
let locations = List<Location>()
}
Run Code Online (Sandbox Code Playgroud)
然后,我sortedLocations在ViewController中调用了一个数组,其中包含许多Organization对象。
到目前为止,我已经尝试过:
func updateSearchResultsForSearchController(searchController: UISearchController)
{
filteredTableData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF.name CONTAINS[c] %@", searchController.searchBar.text!)
let array = sortedLocations.filter(searchPredicate)
filteredTableData = array as! [Organization]
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud) 我正在学习GCD并且对信号量有疑问.这是我的代码:
class ViewController: UIViewController {
var semaphore: dispatch_semaphore_t! = nil
override func viewDidLoad() {
super.viewDidLoad()
semaphore = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) {
print("Entering")
self.semaphoreTask()
print(self.semaphore.debugDescription)
}
semaphoreTask()
print(semaphore.debugDescription)
}
func semaphoreTask() {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
for i in 0...1000 {
print(i)
if i == 1000 {
print("i is equal to 10000!")
}
}
dispatch_semaphore_signal(self.semaphore)
}
Run Code Online (Sandbox Code Playgroud)
如果我运行此代码,那么semaphoreTask中没有任何内容打印在控制台中,但如果我改变了
semaphore = dispatch_semaphore_create(0)
Run Code Online (Sandbox Code Playgroud)
至
semaphore = dispatch_semaphore_create(1)
Run Code Online (Sandbox Code Playgroud)
一切都开始运作良好.
问题是我为什么要写dispatch_semaphore_create(1)而不是0?
谢谢!
试图制作线程安全数组,但它的工作原理与我预期的不一样
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
public class SafeArray<Element> {
private var array = [Element]()
private let queue = DispatchQueue(label: "queueBarrier", attributes: .concurrent)
public func append(element: Element) {
queue.async(flags: .barrier) {
self.array.append(element)
}
}
public var elements: [Element] {
var result = [Element]()
queue.sync {
result = self.array
}
return result
}
public var last: Element? {
var result: Element?
queue.sync {
result = self.array.last
}
return result
}
}
var safeArray = SafeArray<Int>()
var array = Array<Int>() …Run Code Online (Sandbox Code Playgroud) 我想知道Xcode 10是否具有并行测试这么好的功能,为什么它默认关闭?如果有任何情况我最好使用此功能关闭我的测试?
当我运行以下代码时,命令行工具Xcode中的控制台中没有打印出任何内容:
import Foundation
class A {
var someValue = 0
let concurrentQueue = dispatch_queue_create("queue_for_property", DISPATCH_QUEUE_CONCURRENT)
func increaseValueBy1000() {
dispatch_barrier_async(concurrentQueue) {
for _ in 0 ..< 1000 {
let v = self.someValue + 1
print(v)
self.someValue = v
}
}
}
}
let instance1 = A()
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) {
instance1.increaseValueBy1000()
}
instance1.increaseValueBy1000()
Run Code Online (Sandbox Code Playgroud)
我在控制台中看不到任何print语句.如果我删除障碍线工作相当好.在这种情况下我做错了为什么我的障碍不允许打印?
我写了一小段常用代码,但发现我的代码没有从这行代码返回服务器的十六进制数据:
let currentData = try! Data(contentsOf: fullURL!)
print("currentData=", currentData)
Run Code Online (Sandbox Code Playgroud)
并输出:
currentData= 24419 bytes
Run Code Online (Sandbox Code Playgroud)
我试图使用Leo的评论链接:
stackoverflow.com/q/39075043/2303865
我得到一些没有空格的十六进制数据,验证器(http://jsonprettyprint.com)无法识别它并返回null.
有一些我想不通的问题。我在 xib 文件中有一个静态单元格,我想从该单元格的详细信息披露附件转为其他视图控制器。
猜猜我必须使用这种方法:
func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
self.performSegue(withIdentifier: "SegueID", sender: self) // #ERROR
}
Run Code Online (Sandbox Code Playgroud)
但我有一个错误:
无法将“Lists.ListViewController”(0x104c0e7b8)类型的值转换为“UITableViewCell”(0x106875bf8)。
如何正确创建此转场?