Skip to content

Instantly share code, notes, and snippets.

View yimajo's full-sized avatar
:octocat:

Yoshinori Imajo yimajo

:octocat:
  • Curiosity Software inc.
  • Tokyo, Japan
  • 07:32 (UTC +09:00)
View GitHub Profile
@yimajo
yimajo / FirebaseAuthClient.swift
Last active August 5, 2023 03:24
Monitor FirebaseAuth login status with TCA
import ComposableArchitecture
import FirebaseCore
import FirebaseAuth
import GoogleSignIn
struct FirebaseAuthClient {
var observeSignInState: () async -> AsyncStream<Bool>
}
extension FirebaseAuthClient {
@yimajo
yimajo / Query+AsyncTrowingStream.swift
Created March 17, 2023 15:22
Wrap Firestore's addSnapshotListner method for use with AsyncThrowingStream.
import FirebaseFirestore
// MARK: - async
extension Query {
func addSnapshotListener<T>(
includeMetadataChanges: Bool = false
) -> AsyncThrowingStream<[T], Error> where T: Decodable{
.init { continuation in
let listener = addSnapshotListener(includeMetadataChanges: includeMetadataChanges) { result in
@yimajo
yimajo / Query+Result.swift
Created January 23, 2023 06:59
FirebaseFirestore Query Snapshot listener to Result conversion wrapper.
import FirebaseFirestore
@available(swift 5.0)
public extension Query {
func addSnapshotListener(
includeMetadataChanges: Bool = false,
listener: @escaping (Result<QuerySnapshot, Error>) -> ()
) -> some ListenerRegistration {
addSnapshotListener(includeMetadataChanges: includeMetadataChanges) { snapshot, error in
if let error {
@yimajo
yimajo / Makefile
Last active June 1, 2023 03:11
Swift Packageでapple/swift-formatを入れた場合のMakefileの例
XCRUN = /usr/bin/env xcrun --sdk macosx
SWIFT_FORMAT_PATHS = <フォーマットしたいパス>
format:
$(XCRUN) swift run -c release \
swift-format --mode format --recursive --in-place $(SWIFT_FORMAT_PATHS)
format-skip-build :
$(XCRUN) swift run -c release --skip-build \
swift-format --mode format --recursive --in-place $(SWIFT_FORMAT_PATHS)
@yimajo
yimajo / RemoteConfig+addOnConfigUpdateListener.swift
Created May 26, 2023 10:58
Wrap Firestore Remote Config's addOnConfigUpdateListener method for use with AsyncThrowingStream.
import Foundation
import FirebaseRemoteConfig
extension RemoteConfig {
func addOnConfigUpdateListener() -> AsyncThrowingStream<Set<String>, Error> {
.init { continuation in
addOnConfigUpdateListener { configUpdate, error in
if let error {
continuation.finish(throwing: error)
} else {
import FirebaseFirestore
import FirebaseFirestoreSwift
import Foundation
// MARK: - CollectionReference
public extension CollectionReference {
@discardableResult
func add<T: Encodable>(
_ value: T,
@yimajo
yimajo / FirestoreClient.swift
Last active March 13, 2023 09:21
An example of using TCA FirestoreClient with Firestore ios sdk automatically bridged from Objective-C to Swift Concurrency.
import Foundation
import ComposableArchitecture
import FirebaseFirestore
import FirebaseFirestoreSwift
// MARK: - FirestoreClient
struct FirestoreClient {
enum Input {
enum Create {
import UIKit
import PhotosUI
class ViewController: UIViewController {
@IBAction func presentPickerForImagesIncludingLivePhotos(_ sender: Any) {
presentPicker(filter: PHPickerFilter.images)
}
private func presentPicker(filter: PHPickerFilter) {
@yimajo
yimajo / DispatchQueueLabel.swift
Created June 19, 2022 08:54
DispatchQueueをlabelで毎回初期化しても同じqueueが作られるわけではなくデータ競合を起こす
import Foundation
var count = 0
// 結果を保持させてすでに重複しているかを確認
var set = Set<Int>()
for item in 0..<10000 {
let queue = DispatchQueue(label: "fuga")
// データ競合以前にそもそもここでエラーになることもある。 error: Execution was interrupted.
// The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
@yimajo
yimajo / swiftlee.di.swift
Created May 3, 2022 14:07
SwiftLeeのDIがとても良いので紹介したい
// https://www.avanderlee.com/swift/dependency-injection/
// MARK: - Example
struct DataController {
@Injected(\.networkProvider) var networkProvider: NetworkProviding
func performDataRequest() {
networkProvider.requestData()
}