Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.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
Ios 如何在条件变为真实之前限制可观察的_Ios_Swift_System.reactive_Rx Swift_Rx Cocoa - Fatal编程技术网

Ios 如何在条件变为真实之前限制可观察的

Ios 如何在条件变为真实之前限制可观察的,ios,swift,system.reactive,rx-swift,rx-cocoa,Ios,Swift,System.reactive,Rx Swift,Rx Cocoa,我的应用程序中有一个集合视图,当有新内容或删除时,它会用动画刷新。然而,我不希望它在用户滚动时刷新,因为这会导致抖动。我只想在用户完成滚动/未滚动时刷新集合视图 因此,我有一个数据源驱动程序,我尝试使用过滤器使其等待,直到它成为真的,但没有运气 这是我传递给ViewModel let isScrollViewScrollingDriver = Observable.merge( gridCollectionView.rx.willBeginDragging.map { _

我的应用程序中有一个集合视图,当有新内容或删除时,它会用动画刷新。然而,我不希望它在用户滚动时刷新,因为这会导致抖动。我只想在用户完成滚动/未滚动时刷新集合视图

因此,我有一个数据源驱动程序,我尝试使用
过滤器
使其等待,直到它成为真的,但没有运气

这是我传递给
ViewModel

let isScrollViewScrollingDriver = Observable.merge(
            gridCollectionView.rx.willBeginDragging.map { _ in true },
            gridCollectionView.rx.didEndDragging.map { _ in false }
        ).asDriver(onErrorJustReturn: false).startWith(false).distinctUntilChanged()
视图控制器中的my ViewModel init

viewModel = ViewModel(
            photoLibraryService: PhotoLibraryService.shared,
            isGridViewScrolling: isScrollViewScrollingDriver,
            disposeBag: disposeBag
        )
我的视图模型

let assetDriver = photoLibraryService.albumDriver.asObservable()
                .withLatestFrom(
                    isGridViewScrolling.asObservable().filter { $0 == false }
                ) { (arg0, arg1) in
                    return arg0
                }.flatMapLatest { libraryAlbum -> Observable<[LibraryAsset]> in
                    return photoLibraryService.convert(album: libraryAlbum)
                }.asDriver(onErrorJustReturn: []).startWith([]).distinctUntilChanged()
let assetDriver=photoLibraryService.albumDriver.asObservable()
.最晚从(
isGridViewScrolling.asObservable().filter{$0==false}
){(arg0,arg1)in
返回arg0
}.flatmap最新{libraryAlbum->可在中观察到
返回photoLibraryService.convert(相册:libraryAlbum)
}.asDriver(onErrorJustReturn:[]).startWith([]).distinctUntilChanged()
然后我将assetDriver映射到驱动我的集合视图的dataSourceDriver


我可以对assetDriver进行哪些更改,使其等待
isGridViewScrolling
变为
false
?谢谢。

听起来你需要我的
stalluncer(\uu:initial:)
操作员


/**
如果边界序列上次发射为真,则立即发射值,否则从源序列收集元素,直到边界序列发射为真,然后发射收集的元素。
-参数边界:触发事件序列。
-参数初始值:边界的初始值
-返回:一个可观察的序列。
*/
func stalluncer(uu-boundary:O,initial:Bool)->可观察的,其中O:observeType,O.Element==Bool{
返回Observable.merge(self.map(Action.value)、boundary.startWith(initial).distinctUntilChanged().materiale().map(Action.trigger).takeUntil(self.takeLast(1)))
.scan((缓冲区:[Element](),触发器:初始,输出:[Element]()),累加器:{当前,新输入
换新{
案例值(let值):
返回current.trigger?(缓冲区:[],触发器:current.trigger,输出:[value]):(缓冲区:current.buffer+[value],触发器:current.trigger,输出:[])
case.trigger(.next(let trigger)):
返回触发器?(缓冲区:[],触发器:触发器,输出:当前。缓冲区):(缓冲区:当前。缓冲区,触发器:触发器,输出:[])
case.trigger(.completed):
返回(缓冲区:[],触发器:true,输出:current.buffer)
case.trigger(.error(let error)):
抛出错误
}
})
.flatMap{$0.out.isEmpty?Observable.empty():Observable.from($0.out)}
}
}

听起来您需要我的
操作员(uu:initial:)
操作员


/**
如果边界序列上次发射为真,则立即发射值,否则从源序列收集元素,直到边界序列发射为真,然后发射收集的元素。
-参数边界:触发事件序列。
-参数初始值:边界的初始值
-返回:一个可观察的序列。
*/
func stalluncer(uu-boundary:O,initial:Bool)->可观察的,其中O:observeType,O.Element==Bool{
返回Observable.merge(self.map(Action.value)、boundary.startWith(initial).distinctUntilChanged().materiale().map(Action.trigger).takeUntil(self.takeLast(1)))
.scan((缓冲区:[Element](),触发器:初始,输出:[Element]()),累加器:{当前,新输入
换新{
案例值(let值):
返回current.trigger?(缓冲区:[],触发器:current.trigger,输出:[value]):(缓冲区:current.buffer+[value],触发器:current.trigger,输出:[])
case.trigger(.next(let trigger)):
返回触发器?(缓冲区:[],触发器:触发器,输出:当前。缓冲区):(缓冲区:当前。缓冲区,触发器:触发器,输出:[])
case.trigger(.completed):
返回(缓冲区:[],触发器:true,输出:current.buffer)
case.trigger(.error(let error)):
抛出错误
}
})
.flatMap{$0.out.isEmpty?Observable.empty():Observable.from($0.out)}
}
}

您可以使用CombineTest:

    let assetDriver = Driver
        .combineLatest(
            photoLibraryService.albumDriver,
            isGridViewScrolling
        )
        .filter { !$1 }
        .map { $0.0 }
        .flatMapLatest { libraryAlbum -> Driver<[LibraryAsset]> in
            photoLibraryService.convert(album: libraryAlbum)
                .asDriver(onErrorJustReturn: [])
        }
        .startWith([])
        .distinctUntilChanged()
让assetDriver=驱动程序
.联合测试(
photoLibraryService.albumDriver,
isGridViewScrolling
)
.filter{!$1}
.map{$0.0}
.flatMapLatest{libraryAlbum->中的驱动程序
photoLibraryService.convert(相册:libraryAlbum)
.asDriver(onErrorJustReturn:[])
}
.startWith([])
.distinctUntilChanged()

您可以使用CombineTest:

    let assetDriver = Driver
        .combineLatest(
            photoLibraryService.albumDriver,
            isGridViewScrolling
        )
        .filter { !$1 }
        .map { $0.0 }
        .flatMapLatest { libraryAlbum -> Driver<[LibraryAsset]> in
            photoLibraryService.convert(album: libraryAlbum)
                .asDriver(onErrorJustReturn: [])
        }
        .startWith([])
        .distinctUntilChanged()
让assetDriver=驱动程序
.联合测试(
photoLibraryService.albumDriver,
isGridViewScrolling
)
.filter{!$1}
.map{$0.0}
.flatMapLatest{libraryAlbum->中的驱动程序
photoLibraryService.convert(相册:libraryAlbum)
.asDriver(onErrorJustReturn:[])
}
.startWith([])
.distinctUntilChanged()

试试几年前我在.NET中提供的这个答案。没有使用rx swift,因此一些运营商可能有不同的名称,但我认为它正在做您需要的事情:谢谢!!我会试着把它翻译回斯威夫特,看看它是否有效!试试几年前我在.NET中提供的这个答案。没有使用rx swift,因此一些运营商可能有不同的名称,但我认为它正在做您需要的事情:谢谢!!我会试着把它翻译回斯威夫特,看看它是否有效!