我有一个模型,我需要坚持一些实例.只有一些,而不是全部,因为坚持所有实例都是浪费.该型号有primaryKey类型Int
我需要能够将所有对象从后台传递到主线程,因为Realm对象只能由创建它们的线程使用.当前版本的Realm Swift(0.94)似乎不支持将对象直接交给另一个线程.
对于持久化对象(保存到存储的对象write)这不是问题,我可以通过另一个线程获取对象primaryKey.
然而,未经加载的对象是有问题的.当我primaryKey在后台创建一个具有相同对象的新对象时(我认为它应该被视为同一个对象,因为它具有相同的对象primaryKey)并尝试在主线程上获取它(没有持续更改,write因为我不想进入存储),我似乎得到了旧的对象.
我看到以下解决这个问题的方法:
1)坚持所有对象(这是不合需要的,否则不必要)
2)为我想要持久化的对象保持单独的模型(导致代码重复).
3)使用init(value: AnyObject)初始化程序从一个创建未加载的对象Dictionary<String, AnyObject>(可能需要手动将对象属性复制到字典,繁琐且可能容易出错)
还有更好的解决方案吗?
Offtopic:我没有尝试Android的Realm,情况有什么好转吗?
考虑类型Foo:
class Foo {
var isBaz: Bool {
return false
}
func bar() {
print("some boring print")
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们说我想遍历一个类实例集合并在每个类实例上调用一些函数:
let someFoos: [Foo] = [Foo(), Foo(), Foo()]
someFoos.forEach { $0.bar() }
Run Code Online (Sandbox Code Playgroud)
这种语法非常紧凑,但感觉有点尴尬.此外,它无法在任何地方使用.例如,在if声明条件中:
if someFoos.contains { $0.isBaz } {
// compiler error: statement cannot begin with a closure expression
}
if someFoos.contains($0.isBaz) {
// compiler error: anonymous closure argument not contained in a closure
}
if someFoos.contains({ $0.isBaz }) {
// this is correct, but requires extra …Run Code Online (Sandbox Code Playgroud) 我想拥有“ assigning or”和“ assigning and”运算符。根据Swift标准库运算符参考,这些运算符在标准库中定义。
我尝试为这些Bool值实现这些运算符:
func ||= (inout lhs: Bool, rhs: Bool) {
lhs = lhs || rhs
}
func &&= (inout lhs: Bool, rhs: Bool) {
lhs = lhs && rhs
}
Run Code Online (Sandbox Code Playgroud)
但是编译器抱怨: operator implementation without matching operator declaration
这可以通过定义运算符来解决:
infix operator ||= { associativity right precedence 90 }
infix operator &&= { associativity right precedence 90 }
Run Code Online (Sandbox Code Playgroud)
但是我不确定这是正确的做法。为什么标准库中的定义不起作用?另外,我注意到根据操作员参考,标准库没有任何类型的这些操作员的实现。这是为什么?这是疏忽还是故意的?
我有以下脚本执行一个shell命令:
#!/usr/bin/env node
const { execSync } = require('child_process');
try {
const data = execSync(
'yarn licenses generate-disclaimer --prod',
{ encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
);
console.log(data.length);
return true;
} catch (error) {
console.error(`Failed to generate disclaimer: ${error.message}`);
return false;
}
Run Code Online (Sandbox Code Playgroud)
data是子进程的Buffer包含stdout。据我了解,将其转换为字符串的.toString()方法是使用该方法,但就我而言,字符串不完整。我尝试执行的命令应该产生约500 KB的数据,但是它buffer.length是43741(约43 KB)。
问题可能是yarn licenses输出包含一些特殊字符,这会导致缓冲区不完整。如果我将命令替换为printf "%0.s-" {1..500000},则缓冲区已完成。
我正在使用最新的节点版本(8.7.0)。
有什么想法/建议吗?
编辑:追加| tr "\0" "\n"到该命令将缓冲区大小增加到〜122 KB,所以@YaroslavAdmin肯定是朝正确的方向看。结果仍然是不完整的。如何确保所有特殊字符均已转义?
是否可以使用模式匹配与三元if运算符?
请考虑以下示例:
let someString: String? = ...
if let embedURL = embedURL {
return NSURL(string: embedURL)
} else {
return nil
}
Run Code Online (Sandbox Code Playgroud)
这很冗长.我希望能够做到这样的事情:
return let someString = someString ? NSURL(string: someString) : nil
Run Code Online (Sandbox Code Playgroud)
要么
return case let .Some(someString) = someString ? NSURL(string: someString) : nil
Run Code Online (Sandbox Code Playgroud)
但编译器不接受这一点.我知道我可以添加一个NSURL接受可选字符串的初始值设定项,使用普通if语句或甚至switch语句,但我想知道是否可以使用三元if运算符,或者是否可以在将来的某个时候使用它.
我有一个ListView以下适配器:
private class ListAdapter extends BaseAdapter {
private List<Item> items;
private ImageCache imageCache;
public ListAdapter(List<Item> item) {
this.items=items;
imageCache=ImageCache.getInstance();
}
//nothing special here
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.listitem, parent, false);
viewHolder = new ViewHolder();
viewHolder.imgView = (ImageView) convertView.findViewById(R.id.imgview);
viewHolder.txtView = (TextView) convertView.findViewById(R.id.txtview);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Item item = getItem(position);
//this method is used to start download
imageCache.load(item.getImageURL(), viewHolder.imgView); …Run Code Online (Sandbox Code Playgroud) 我正在开发自定义ViewGroup.它是某种径向菜单(类似于Android相机应用程序中的选项菜单).
我设法正确地布置和画儿童.我要做的另一件事是覆盖触摸事件调度:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
for (int i=0; i<getChildCount(); i++) {
CircularView child=(CircularView) getChildAt(i);
if (child.viewMetrics.containsPoint(ev.getX(), ev.getY())) {
child.dispatchTouchEvent(ev);
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
如果事件坐标属于任何一个(child.viewMetrics.containsPoint()方法调用,双重检查,正常工作),我遍历子节点并调度事件.
似乎工作,但它并不完美.我注意到了这个问题:当我点击时,握住我的手指并稍微移动它,点击就会中断.这是演示.
我查看了超类的实现,并且有很多代码.我的第一个想法是复制它,但它取决于许多私人课程.
如何确保触摸事件调度正常工作?(不仅是点击,还有所有其他手势?)如果没有简单的方法可以做到这一点,我将非常感谢有关移植默认实现的任何意见或建议或任何有关该主题的有用信息的链接.
我正在尝试在UILabel. 这个问题之前已经被问过很多次了,答案很简单:
override func awakeFromNib() {
super.awakeFromNib()
let fontSize: CGFloat = 24
let descriptor = UIFont
.systemFont(ofSize: 24)
.fontDescriptor
.addingAttributes([
UIFontDescriptor.AttributeName.featureSettings: [
UIFontDescriptor.FeatureKey.featureIdentifier: kLowerCaseType,
UIFontDescriptor.AttributeName.featureSettings: kLowerCaseSmallCapsSelector
]
])
titleLabel.font = UIFont(descriptor: descriptor, size: fontSize)
titleLabel.text = "Welcome"
}
Run Code Online (Sandbox Code Playgroud)
然而,这段代码不起作用,我不明白为什么。我有几个想法:
UILabel.text。然而,使用该UILabel.attributedText属性并不能解决问题。UILabel根本不支持小型大写字体。我尝试过UITextView,但结果是一样的。还有什么我可能想念的吗?
我有以下课程:
@implementation MyUICollectionViewCell {
CAShapeLayer *layr;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.layer.mask = [CAShapeLayer layer];
layr = [CAShapeLayer layer];
}
return self;
}
- (void)initMask {
self.layer.mask = [CAShapeLayer layer];
}
- (void)updateMask {
CAShapeLayer *maskLayer = (CAShapeLayer*) self.layer.mask;
maskLayer.frame = ...;
maskLayer.path = ...;
}
@end
Run Code Online (Sandbox Code Playgroud)
如果我self.layer.mask在构造函数中赋值,则它nil在updateMask方法中.但是,如果赋值是在initMask方法中完成的(从类外部调用),一切正常.
谁能解释一下这里发生了什么?
编辑:
尝试将对象存储在ivar(即layr)中,但无济于事 - 它仍然nil存在updateMask.
ios ×4
swift ×4
android ×2
core-text ×1
listadapter ×1
node.js ×1
objective-c ×1
realm ×1
typography ×1
uilabel ×1