我有一个测试人员提交的错误,如果他执行一个动作,然后重新启动他的手机(通过按下主页和睡眠/唤醒按钮几秒钟)该应用程序不是持久状态.
我已经能够重现这个问题.[同步NSUserDefaults的] 是获取调用,但是当我在重新启动后重新启动应用程序,NSUserDefaults的里面的价值没有被保存.
是否有人知道是否将存储同步到稍后保存到磁盘的缓冲区?如果是这样,我如何刷新缓冲区(我认为同步与刷新相同,但显然不是.)
(编辑)换句话说:
assert([[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO);
[[NSUserDefaults standardUserDefaults] setBool: YES forKey: MY_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)
将应用程序保留在前台并在调用上述设备后重新启动设备,然后启动设备备份并重新运行应用程序.断言应该第二次触发,但有时它不会.
非常具体......我创建了一个单独的视图应用程序,并将以下代码放在viewDidLoad中
#define MY_KEY @"MY_KEY"
- (void)viewDidLoad
{
[super viewDidLoad];
BOOL key = [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY];
NSLog(@"[[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == %@", key ? @"YES" : @"NO");
[[NSUserDefaults standardUserDefaults] setBool: !key forKey: MY_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"reboot now.");
}
Run Code Online (Sandbox Code Playgroud)
以下是该应用程序的三次运行的输出:
2013-05-31 12:17:44.127 syncTest[162:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == YES
2013-05-31 12:17:44.133 syncTest[162:907] reboot now.
2013-05-31 12:18:49.771 syncTest[128:907] [[NSUserDefaults …Run Code Online (Sandbox Code Playgroud) 我仍然是一个反应新手,我正在寻求帮助.
func doA() -> Observable<Void>
func doB() -> Observable<Void>
enum Result {
case Success
case BFailed
}
func doIt() -> Observable<Result> {
// start both doA and doB.
// If both complete then emit .Success and complete
// If doA completes, but doB errors emit .BFailed and complete
// If both error then error
}
Run Code Online (Sandbox Code Playgroud)
以上是我认为我想要的...初始函数doA()和doB()包装网络调用,因此它们将发出一个信号然后Complete(或Error不发出任何Next事件.)如果doA()完成但是doB()错误,我想doIt()发射.BFailed然后完成.
感觉就像我应该使用zip或者combineLatest我不知道如果我这样做,如何知道哪个序列失败了.我也很确定这catchError …
我有 3d 方库 ( Firestore) 有这个方法
func listenToEvents(handler: ([Result], Error) -> Void)
Run Code Online (Sandbox Code Playgroud)
handler该方法被多次调用(在数据更新之后)。我想将其转换为Publisher
现在这是我的代码:
var resultsPublisher: AnyPublisher<[Result], Error> {
Deferred {
Future { promise in
libraryObject.listenToEvents { results, error in // called multiple times
guard let results = results else {
promise(.failure(error))
return
}
// this can't be called several times,
// because Future's promise is supposed to be called only once
promise(.success(results))
}
}
}
.eraseToAnyPublisher()
}
Run Code Online (Sandbox Code Playgroud)
所以我的Publisher值只产生一次,因为Future这样工作。是否有任何其他Publishers(或可能是不同的方法)来实现这一目标?
鉴于以下内容:
struct Weekdays: OptionSetType {
let rawValue: Int
init(rawValue: Int) { self.rawValue = rawValue }
static let Monday = Weekdays(rawValue: 1)
static let Tuesday = Weekdays(rawValue: 2)
static let Wednesday = Weekdays(rawValue: 4)
static let Thursday = Weekdays(rawValue: 8)
static let allOptions: [Weekdays] = [.Monday, .Tuesday, .Wednesday, .Thursday]
}
Run Code Online (Sandbox Code Playgroud)
我可以通过这样做将数组Ints转换为Weekdays对象:
let arr = [1, 4]
let weekdays = arr.reduce(Weekdays()) { $0.union(Weekdays(rawValue: $1)) }
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何获取一个Weekdays对象并将其转换为一个数组Ints?
我在我的应用程序中使用了一个用于日志记录页面的表单,并且在页脚上有一个绑定来显示任何错误,如下所示:
内容视图.Swift :
Form { Section(footer: Text(self.viewModel.errorMessage))
Run Code Online (Sandbox Code Playgroud)
视图模型.swift
init() {
self.isCurrentNameValid
.receive(on: RunLoop.main)
.map { $0 ? "" : "username must at least have 5 characters" }
.assign(to: \.errorMessage, on: self)
.store(in: &cancelSet)
}
Run Code Online (Sandbox Code Playgroud)
问题是 viewModel 中的分配是在 init 中执行的,所以当我启动我的应用程序时,即使用户还没有尝试写任何东西,它也会显示消息。
Is there a way to skip first event like in RxSwift where you would just .skip(1) in combine framework?