以编程方式添加视图时,addSubview和insertSubView方法之间的区别是什么?
我有一个观察,我只想开始一次.文档说:
使用配置袋或takeUntil操作员是确保清理资源的有效方法.我们建议在生产中使用它们,即使序列将在有限时间内终止.
我的观察结果在一次事件后终止
let observable = Observable.create() { observer in
webservice.makeHTTPRequestWithCompletionBlock {
if something {
observer.on(.Next(...))
observer.onCompleted()
} else {
observer.on(.Error(...))
}
}
}
Run Code Online (Sandbox Code Playgroud)
假设我对取消此观察者的订阅者不感兴趣,我只想让它运行一次并完成.我希望这个observable的生命周期在工作本身完成时结束.这意味着我无法看到disposeBag的好候选人.takeUntil也期待一个'事件',而且我看不到好的事件.
现在我只是通过丢弃一次性来解决警告:
_ = observeable.subscribeNext { ... }
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者我应该使用不同的范例?
我愿意使用RxSwift在模型值和视图控制器之间进行MVVM绑定.我想按照这个realm.io教程,但从那时起绑定显然已经改变,示例代码不能编译.这是示例代码,我认为我已经修复了最糟糕的拼写错误/丢失的东西:
LoginViewModel.swift
import RxSwift
struct LoginViewModel {
var username = Variable<String>("")
var password = Variable<String>("")
var isValid : Observable<Bool>{
return Observable.combineLatest(self.username.asObservable(), self.password.asObservable())
{ (username, password) in
return username.characters.count > 0
&& password.characters.count > 0
}
}
}
Run Code Online (Sandbox Code Playgroud)
LoginViewController.swift
import RxSwift
import RxCocoa
import UIKit
class LoginViewController: UIViewController {
var usernameTextField: UITextField!
var passwordTextField: UITextField!
var confirmButton: UIButton!
var viewModel = LoginViewModel()
var disposeBag = DisposeBag()
override func viewDidLoad() {
usernameTextField.rx.text.bindTo(viewModel.username).addTo(disposeBag)
passwordTextField.rx.text.bindTo(viewModel.password).addTo(disposeBag)
//from the viewModel
viewModel.rx.isValid.map { $0 } …Run Code Online (Sandbox Code Playgroud) 抱歉.我很困惑Rxswift中的绑定是什么.据我所知,observable除非观察者订阅了它,否则不会产生价值,例如myObservable.subscribe(onNext: {}).
但是当我阅读以下代码行时:
// in LoginViewModel.swift
init() {
isValid = Observable.combineLatest(username.asObservable(), password.asObservable()) { (username, password) in
return !username.isEmpty && !password.isEmpty
}
}
// in LoginViewController.swift
viewModel.isValid.bind(to: loginButton.rx.isEnabled).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么isValidObservable能够在不调用subscribe方法的情况下被观察到?
为什么我们可以调用bind(to :) in LoginViewController.swift而不调用类似的东西viewModel.isValid.subscribe(...)
以下代码给出了编译错误
'WeakReference'要求'ServiceDelegate'是类类型
protocol ServiceDelegate: AnyObject {
func doIt()
}
class SomeClass() {
// compile error occurs in this line
private var observers = [WeakReference<ServiceDelegate>]()
}
Run Code Online (Sandbox Code Playgroud)
WeakReference代码:
final class WeakReference<T: AnyObject> {
private(set) weak var value: T?
init(value: T?) {
self.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?应根据此站点正确声明委托.
到目前为止我尝试了什么:
AnyObject,以
class不解决问题.我有一个label与isUserInteractionEnabled设置为true.现在,我需要添加UITapGestureRecognizer标签.有没有办法添加Rx方式.
我在这里查看了RxSwift库.他们没有为添加手势提供任何扩展.该UILabel+Rx文件只有text和attributedText.
是否有任何解决方法可以添加手势到标签?
我希望在UILabel或UITextField中缩小某些文本的字体大小.这在iOS 7.0之前是可能的:如何获得UILabel(UITextView)自动调整的字体大小?.但是,sizeWithFont已在iOS 7.0中弃用.我已经尝试使用它的替换,sizeWithAttributes,但没有成功.在iOS 7.0中有没有办法做到这一点?
我正在使用a UIPrintPageRenderer与a UIMarkupTextPrintFormatter一起打印一个html页面,该页面呈现在UIWebView.我试图实现以下目标:我想将html内容作为透明层渲染到上下文中,但是当使用UIPrintPageRenderer上下文覆盖下面的所有内容进行渲染时,html内容的背景颜色始终为白色.
html样式包含以下代码段:
body {
background-color: transparent !important;;
-webkit-print-color-adjust: exact;
}
Run Code Online (Sandbox Code Playgroud)
在UIWebView我可以看到html的背景确实是透明的,因为我将背景设置UIWebView为不同的颜色.
这是我用于创建PDF数据的代码:
let printPageRenderer = UIPrintPageRenderer()
let printFormatter = UIMarkupTextPrintFormatter(markupText: htmlContent)
printPageRenderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, Constants.Pdf.rect, nil)
let context = UIGraphicsGetCurrentContext()!
for i in 0..<printPageRenderer.numberOfPages {
UIGraphicsBeginPDFPage()
let backCoverView = UIView(frame: Constants.Pdf.rect)
backCoverView.backgroundColor = UIColor(patternImage: UIImage(named: "background.png")!)
backCoverView.layer.render(in: context)
context.clear(printableRect)
printPageRenderer.setValue(NSValue(cgRect: printableRect), forKey: "printableRect")
printPageRenderer.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
}
UIGraphicsEndPDFContext()
Run Code Online (Sandbox Code Playgroud)
我的问题是通过"background.png"呈现的html内容不透明但具有白色背景.html样式中的透明属性似乎被忽略了UIPrintPageRenderer.将background-color …
情况:微服务架构具有:
enabled与之关联的状态。将来不太可能添加更多属于Option 的属性,这些属性必须与其直接绑定。enum OptionType {
TYPE_A,
TYPE_B,
TYPE_C;
}
enum Option {
TYPE_A_X1(TYPE_A),
TYPE_A_X2(TYPE_A),
TYPE_B_Z1(TYPE_B, false),
TYPE_B_Z2(TYPE_B);
TYPE_C_U1(TYPE_C);
TYPE_C_U2(TYPE_C);
TYPE_C_U3(TYPE_C);
private final OptionType type;
private final boolean enabled;
Option(OptionType type){
this.type = type;
this.enabled = true;
}
Option(OptionType type, boolean enabled){
this.type = type;
this.enabled = enabled; …Run Code Online (Sandbox Code Playgroud) 我正在为大型视频文件创建MD5校验和.我目前正在使用代码:
extension NSData {
func MD5() -> NSString {
let digestLength = Int(CC_MD5_DIGEST_LENGTH)
let md5Buffer = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLength)
CC_MD5(bytes, CC_LONG(length), md5Buffer)
let output = NSMutableString(capacity: Int(CC_MD5_DIGEST_LENGTH * 2))
for i in 0..<digestLength {
output.appendFormat("%02x", md5Buffer[i])
}
return NSString(format: output)
}
}
Run Code Online (Sandbox Code Playgroud)
但这会产生一个内存缓冲区,对于大型视频文件来说并不理想.在Swift中有没有办法计算读取文件流的MD5校验和,因此内存占用量最小?