Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用反应式Cocoa的简单textfield验证器_Swift_Reactive Cocoa - Fatal编程技术网

Swift 使用反应式Cocoa的简单textfield验证器

Swift 使用反应式Cocoa的简单textfield验证器,swift,reactive-cocoa,Swift,Reactive Cocoa,我正在操场上测试反应性可可粉。我想在执行网络请求之前测试字符串的有效性 我不知道如何组合文本字段信号和验证信号tho。代码中标记为[??]=>的部分进行过滤的正确方法是什么 var textField = UITextField() textField.text = "http://localhost:3000/users.json" let searchStringsProducer = textField.rac_textSignal().toSignalProducer() let

我正在操场上测试反应性可可粉。我想在执行网络请求之前测试字符串的有效性

我不知道如何组合文本字段信号和验证信号tho。代码中标记为[??]=>的部分进行过滤的正确方法是什么

var textField = UITextField()

textField.text = "http://localhost:3000/users.json"

let searchStringsProducer = textField.rac_textSignal().toSignalProducer()

let searchStringValidProducer = searchStringsSignal.toSignalProducer().map{
  text in
  (text as! String).containsString("http")
}

// this produces a ReactiveCocoa.SignalProducer<(Optional<AnyObject>, Bool), NSError>. 
let searchStringCombined = combineLatest(searchStringsProducer, searchStringValidProducer)


// turns the simple search results into a signal 
let searchResults = searchStringCombined

// [??] i would like to ONLY execute on the rest of the actions if it is valid
.map{ // what do i do here before passing on to the network API }

.flatMap(FlattenStrategy.Latest) { 
  latestStr -> SignalProducer<[AnyObject], NSError> in
    return requestJSON(latestStr, parameters: nil)
    .flatMapError { error in
      print("Network error occurred: \(error)")
      return SignalProducer.empty
    }

}.observeOn(uis)
var textField=UITextField()
textField.text=”http://localhost:3000/users.json"
让searchStringsProducer=textField.rac_textSignal().toSignalProducer()
让searchStringValidProducer=searchStringsSignal.toSignalProducer().map{
文本输入
(文本形式为!字符串)。包含字符串(“http”)
}
//这将生成一个ReactiveCocoa.SignalProducer。
让searchStringCombined=CombineTest(searchStringsProducer,searchStringValidProducer)
//将简单的搜索结果转换为信号
让searchResults=searchStringCombined
//[??]我只希望在其他操作有效的情况下执行
.map{//在传递到网络API之前,我在这里做什么}
.flatMap(flattstrategy.Latest){
最新str->SignalProducer in
return requestJSON(latestStr,参数:nil)
.flatMapError{中的错误
打印(“发生网络错误:\(错误)”)
返回信号发生器。空
}
}.观察者(uis)
这种模式很麻烦,因为当
searchStringsProducer
发送一个值时,
searchStringCombined
将发送两个值——一个用于新字符串,一个用于新布尔值。这样定义这个信号会更简洁:

let searchStringCombined = searchStringsSignal.toSignalProducer().map { text in
  (text, (text as! String).containsString("http"))
}
这会给你同样的结果


但是您根本不需要定义
searchStringCombined
,除非您在其他地方使用它。您应该能够通过一个简单的
过滤器

searchStringsSignal.toSignalProducer().filter({ text in
  (text as! String).containsString("http")
}).map({
    /* whatever goes here */
}).flatMap(FlattenStrategy.Latest) {
    /* perform network request */
}
filter
有点像
map
,它接受一个函数并返回一个信号。但它只允许一些值通过,从而允许您仅基于有效输入发出网络请求

这种模式很麻烦,因为当
searchStringsProducer
发送一个值时,
searchStringCombined
将发送两个值——一个用于新字符串,一个用于新布尔值。这样定义这个信号会更简洁:

let searchStringCombined = searchStringsSignal.toSignalProducer().map { text in
  (text, (text as! String).containsString("http"))
}
这会给你同样的结果


但是您根本不需要定义
searchStringCombined
,除非您在其他地方使用它。您应该能够通过一个简单的
过滤器

searchStringsSignal.toSignalProducer().filter({ text in
  (text as! String).containsString("http")
}).map({
    /* whatever goes here */
}).flatMap(FlattenStrategy.Latest) {
    /* perform network request */
}

filter
有点像
map
,它接受一个函数并返回一个信号。但是它只允许一些值通过,只允许您根据有效输入发出网络请求。

ian,感谢您的精彩解释。效果很好。我仍然有点困惑的是,我如何将两个不同类型的信号发生器组合成一个流。另一方面,RxSwift似乎能更优雅地对观测值进行严格的泛型输入。@mingyow你可以通过
flatte(.Merge)
实现这一点。它很适合作为一个助手:
func merge(signals:SignalProducer…->SignalProducer{return SignalProducer(值:signals).flatten(.merge)}
。RAC 4有很好的通用类型信号,但是UIKit扩展都是从非类型化的RAC 2帮助程序继承的…(当然,您需要首先将它们映射到同一类型中…例如,就像覆盖这两种情况的枚举信号一样。)ian,感谢您的精彩解释。效果很好。我仍然有点困惑的是,我如何将两个不同类型的信号发生器组合成一个流。另一方面,RxSwift似乎能更优雅地对观测值进行严格的泛型输入。@mingyow你可以通过
flatte(.Merge)
实现这一点。它很适合作为一个助手:
func merge(signals:SignalProducer…->SignalProducer{return SignalProducer(值:signals).flatten(.merge)}
。RAC 4有很好的通用类型信号,但是UIKit扩展都是从非类型化的RAC 2帮助程序继承的…(当然,您需要首先将它们映射到同一类型中…例如,就像覆盖这两种情况的枚举信号一样。)