Firebase'in API'lerinin çoğu eşzamansızdır.
Bu ilk başta kafa karıştırıcı olabilir: örneğin Firestore'dan bazı verileri almak için bir arama yapıyorsunuz, ancak bir sonuç alamıyorsunuz.
Bu neden oluyor, "eşzamansız API" ne anlama geliyor ve Swift'de eşzamansız API'leri nasıl çağırıyorsunuz?
Kendinize bu soruları soruyorsanız, yalnız değilsiniz - kelimenin tam anlamıyla, bunlar Firebase hakkında StackOverflow ve GitHub depolarımızda en sık sorulan sorulardan bazıları.
Bu gönderide, tüm bunların ne anlama geldiğini açıklayacağım ve size Swift / SwiftUI uygulamanızdan Firebase API'lerini eşzamansız olarak çağırmanın üç kolay yolunu göstereceğim.
Eşzamansız API'lerin doğasını anlamak için, bir kafede olduğumuzu ve siparişinizi verdiğinizi düşünelim. Barista yağsız sütü almak için arkasını döndü ve içkinizi hazırlamaya başladı.
İçeceğinizi beklerken, sıradaki başka biriyle sohbet edebilir veya önemli bir haber için telefonunuza bakabilirsiniz. Hava durumu veya o M2 MacBook hakkındaki en son söylentiler hakkında bir konuşma başlatmak için bana dönüyorsun.
Barista içkinizi hazırlamayı bitirdiğinde size teslim eder:
"Başka bir şey?"
"Hayır, teşekkürler"
“O zaman 2.49 olacak”
Ödeme yaparsınız ve barista sıradaki kişiye döner.
Az önce eşzamansız bir süreç yaşadık: barista içkinizi hazırlamakla meşgulken, nefesinizi tutarak hareketsiz durmanıza gerek yoktu. Bu gerçekten çok rahatsız edici olurdu. Hayır, normal nefes alabiliyordun ve hatta benimle sohbet edebiliyordun.
Aynısı uygulamalarımız için de geçerlidir: Uygulama, sunucunun bir ağ isteğinin sonucunu döndürmesini beklerken ön plan işleminin (UI güncellemelerini yönlendiren) donmasını istemiyoruz. Belki bunu daha önce bazı uygulamalarda yaşadınız ve birkaç saniye sonra sabrınızı kaybettiniz. Bu olduğunda, kullanıcılar genellikle uygulamadan ayrılır veya uygulamayı kapatır. Ve bunun olmasını istemiyoruz.
Bu nedenle, biraz daha uzun sürebilecek birçok API eşzamansız olarak uygulanır: onları çağırırsınız ve onlar arka planda kendi işlemlerini başlatırken kontrolü hemen arayana geri verirler. Bitirdiklerinde, asıl arayanı geri arayacaklardır. Tıpkı kahve barı örneğinde olduğu gibi.
Şimdi, bir kahve barında, barista kime geri dönmeleri gerektiğini biliyor, çünkü ya adınızı alıyorlar, ya da yüzünüzü hatırlıyorlar ya da hala tezgahta duruyorsunuz.
Ancak bu, uygulamalarımızda nasıl çalışır? Eşzamansız API'leri nasıl çağırabileceğinizi üç farklı şekilde inceleyelim:
Geri aramalar muhtemelen zaman uyumsuz API'leri uygulamanın en yaygın kullanılan yoludur ve büyük olasılıkla bunları kodunuzda zaten kullanmışsınızdır. Objective-C günlerinden beri varlar ( tamamlama blokları olarak adlandırıldıklarında) . Swift'de geri aramaları uygulamak için kapanışları kullanırız.
Swift, sondaki kapanışları her zaman destekledi ve Swift'de geri aramaları kullanmayı daha da zarif hale getirdi. Sondaki kapatma sözdizimini kullanırken yukarıdaki kodun nasıl göründüğü aşağıda açıklanmıştır:
Parametre etiketini nasıl kaldırdığımıza ve ilk parametreden hemen sonra kapatma parantezini nasıl hareket ettirdiğimize dikkat edin. Bu, özellikle birkaç satıra yayılan kapaklar için kodun okunmasını çok daha kolay hale getirir.
Dahili DSL'ler
Bunun gibi kod yazabilmek, işlev çağrısının neredeyse dilin bir parçası gibi görünmesini sağlar. Takip eden kapatmaların kullanılması, SwiftUI DSL'nin en önemli etkinleştiricilerinden biridir ve UI kodu yazmanın bu kadar doğal görünmesinin nedenidir. SwiftUI dahili bir DSL'dir - ana bilgisayar dilinde yazılmıştır, mevcut araç zincirlerine entegrasyonu kolaylaştırır ve ana bilgisayar diline zaten alışmış geliştiriciler için öğrenmeyi kolaylaştırır.
Daha fazla ayrıntı için, Martin Fowler'ın dahili DSL'ler hakkındaki makalesine bakın .
Bunu çalışırken görmek için Firebase'in API'lerinden birine bakalım. İşte bir çağrı
signIn(withEmail:password:):
Bu kodun bazı önemli yönlerini tartışalım:
signIn(withEmail:password:). Yöntem imzasına bakarsanız, üçüncü bir parametre olduğunu fark edeceksiniz,
completion:. Swift'in sondaki kapatma sözdizimi sayesinde, bu parametreyi çağrı imzasının dışına taşıyabilir ve kapatmayı çağrının sonuna, parantezin dışına ekleyebiliriz. Böylece daha akıcı ve göze hoş geliyor.
Birleştirme, Apple'ın asenkron olayları işlemeye yönelik reaktif çerçevesidir. Olayların (kullanıcı girişi veya ağ yanıtları gibi) nasıl ele alınması gerektiğini açıklamak için bildirime dayalı bir API sağlar.
Firebase, bazı önemli API'leri (Firebase Authentication, Cloud Firestore, Cloud Functions ve Cloud Storage gibi) için Combine'ı destekler.
Firebase için Combine'ı kullanmak için ilgili modülü hedefinize ekleyin (örn
FirebaseAuthCombine-Community. ) ve içe aktarın.
signIn(withEmail:password:)Yöntemi çağırmak için Combine'ı nasıl kullanabileceğiniz aşağıda açıklanmıştır .
Çağrının ilk bölümünün, önceki bölümde kullandığımızla neredeyse aynı olduğuna dikkat edin. Bu, Firebase'in eşzamansız API'lerini çağırmanın bir yolundan diğerine geçişi kolaylaştırmak için bilerek yapılmıştır.
Sonraki adımlarda:
userCombine
mapoperatörünü kullanarak nesneyi çıkarın (2)
nildeğerle değiştirerek işleyin (3)
truekullanıcı nesnesi ayarlanmışsa geri dönün (4)
Bu kod, geri aramaları kullanırken yazmamız gerekenden çok daha kompakt ve özlüdür. Kombine'nin bildirimsel programlama modeli, ağ isteğini ve yanıtını nasıl işleyeceğini Swift'e söylemek yerine, ne yapmak istediğimizi tanımlamamıza izin verir.
Uygulamanızdaki veri akışını açıklamak için bildirimsel bir çerçeve kullanmak (Combine), uygulamanızın kullanıcı arayüzünü (SwiftUI) açıklamak için bildirimsel bir çerçeve kullanmakla güzel bir uyum içindedir.
Eşzamansız API'leri çağırmanın son (ve muhtemelen en zarif) yolu
async/
await. Bu, Swift 5.5'te tanıtılan ve asenkron kodu çağırmamıza ve çağrılan kod dönene kadar mevcut iş parçacığını askıya almamıza izin veren yeni bir dil özelliğidir.
signIn(withEmail:password:)async/await kullanarak nasıl arayabileceğimizi görelim :
signIn(withEmail:password:)ile çağrısına önek eklememiz gerekiyor .
awaitBir kapatma sağlamamız gerekmediğine dikkat edin - kullanmak
await, iş parçacığını askıya alacak ve kullanıcı oturum açtıktan sonra işlem bir nedenden dolayı başarısız olduğunda yürütmeye devam edecektir. İş parçacığı askıya alındığında, uygulamanın ön plan iş parçacığı olayları işlemeye devam eder, bu nedenle uygulama donmaz.
await, işlevimizi eşzamansız hale getirir. Arayanların bunu bilmesini sağlamak için
asyncanahtar kelime ile işaretlememiz gerekiyor. Derleyici, bu işlevin yalnızca başka bir eşzamansız bağlamdan çağrıldığından emin olacaktır. Birazdan bunun hakkında daha fazla bilgi.
signIn(withEmail:password:)bir istisna oluşturabileceğinden, tüm çağrıyı bir
do/try/catchbloğa (3, 4) sarmamız gerekir.
isSignedInView modelimizde özelliğin çağrısının sonucunu atarken, bunun ana iş parçacığında olduğundan emin olmamız gerekiyor. Bu atamayı bir çağrıya sarmak yerine , tüm fonksiyonun ana iş parçacığında (5) yürütüldüğünden emin olmak için özniteliği
DispatchQueue.main.async { }kullanabiliriz .
@MainActor
Artık Swift Concurrency'i macOS Catalina 10.15, iOS 13, tvOS 13 ve watchOS 6 veya daha yeni sürümlere dağıtılan uygulamalarda kullanabilirsiniz. Bu destek,
async/
await, aktörler, küresel aktörler, yapılandırılmış eşzamanlılık ve görev API'lerini içerir. (70738378)
Şu anda düzeltmekte olduğumuz birkaç istisna dışında, Firebase'in eşzamansız çağrılarının neredeyse tamamı eşzamansız/bekleme için hazır. async/await kullanarak arayamayacağınız herhangi bir yöntemle karşılaşırsanız, üzerinde çalışıp çalışmadığımızı görmek için sorun izleyicimize bakın. Değilse, bir sorun gönderin ve biz de araştıralım.
Hangi platformları hedef alırsak alalım, ağ üzerinde ağır görevler gerçekleştirirken bile uygulamalarımızın hızlı çalışmasını ve sorunsuz çalışmasını sağlamak bizim için en önemli önceliktir.
Firebase ve diğerleri gibi SDK'lar, zaman uyumsuz API'ler sağlayarak geliştiricilerin tutarlı ve tutarlı bir programlama modeline güvenebilmelerini sağlar. Bu, geliştiricilerin en çok önemsedikleri şeye odaklanmalarını sağlar: kullanıcılarına değer sağlamak ve onlara harika deneyimler ve hızlı kullanıcı arayüzleri ile ilham vermek.
Bu gönderide, Apple platformlarında zaman uyumsuz olarak Firebase API'lerine erişmek için kullanabileceğiniz en yaygın üç yoldan size yol gösterdim.
Genel bir kural olarak, çağırmak istediğiniz yöntemin imzasını kontrol edin. Son parametresi bir tamamlama işleyicisiyse (en yaygın olarak adlandırılan
completion), bu makalede açıklanan tekniklerden herhangi biriyle çağırabileceğiniz zaman uyumsuz bir yöntemle uğraşıyorsunuz demektir.
Bunun diğer dillerde nasıl çalıştığını merak ediyorsanız, Doug'ın makalesine bakın: Firebase API neden eşzamansız?
Okuduğunuz için teşekkürler! 🔥
İlk olarak https://peterfriese.dev adresinde yayınlanmıştır .
Yaz sonu ve sonbahar nostaljik mevsimlerdir. Sokak lambaları ışıklarını yağmurlu sokaklara saçıyor ve ayakların altındaki yapraklar - alacakaranlığın gölgelerinde soluk kırmızı-turuncu - geçmiş günlerin bir hatırlatıcısı.
Mars, Uranüs ve Kuzey Düğümü, 1 Ağustos 2022'de 18 derecede Boğa burcunda kavuşuyor. Yataklarımız yanarken nasıl uyuruz?-Gece yarısı yağı Yılın en önemli astrolojik yönlerinden biri olan Mars ve Uranüs'ün kaderin Kuzey Düğümü ile kavuşumu, gerçek bir aciliyet hissinin eşlik ettiği büyük bir uyandırma çağrısıdır.
2021'de hizmet verdiğiniz müşteriler ve onlara anlattığınız hikayeler hakkında bildiğiniz her şeyi yeniden düşünmenizi tavsiye ediyorum. Geri adım atmak.
Güncel özet: Mevcut makro durum değişmeden kalsa da, faiz oranlarını artırma zamanı yaklaştıkça daha "öngörülü" fişler piyasadan çekilecek, ki bu normaldir. yatırımcılar üzerinde bir etki, bu etki sadece duygusal değil, aynı zamanda tüm Amerikalıları yiyecek, giyecek, barınma ve ulaşım gibi çeşitli yönlerden etkiliyor. İşte tam da bu nedenle daha fazla yatırımcı chiplerini borsalara önceden transfer ediyor veya önceden diplerde satmaya hazırlanıyor.Sadece faiz artırımından sonra trend üzerine bahse girmek istemiyorlar.Durum hala iyi, ancak sabah 6:45'te parçalandı ve şu ana kadar parçalandı. Bu, düşüşün duygusal tarafındaki panik ve iyi zamanlanmış. Ama yine de bir haftadır söyledim.Şu anda makro oyun koşulları büyük çaplı düşüş ve yükseliş trendini desteklemiyor.Faiz oranları ve GSYİH'nın tam olarak inmesi için genel şok düzenini değiştirmek zor. . Aslında her sabah Cumartesi ve Pazar günleri bu seviyede bir ezilme oluyor, daha iki gün önce yakalandı ve sonra hareket olmadı, bugün yakalanmadı ve ardından panikli bir takibi tetikledi. Bu sabah 10:00 itibariyle BTC pozisyonlarının fiyat dağılımı ve dün gece 23:00'ten bugüne veriler, bu sabahın erken saatlerinde başlayan ancak büyük bir artış görmeyen hızla yükselen ve ardından düşen düşüşü yaşadı. BTC adreslerindeki değişikliklerin sayısı Değişikliğin ölçeği, çünkü bu iniş ve çıkışların aşırı güçlü bir tepkiye neden olmayacağı, ancak borsada önceden depolanan çiplerin duygusal değişimlerinin daha fazla olacağı yargısına varılabilir. Her iki taraftaki aşırı fiyatlara bakılırsa, eskilerin elindeki BTC, hafta sonu boyunca hala normal dalgalanma aralığını izliyor, sadece 200 BTC'den fazlası bir bütün olarak piyasadan ayrılıyor, yüksek seviyede tutulan fişler büyük ölçüde dalgalanıyor, yaklaşık 51.000 $ civarında. Yaklaşık 1.900 BTC'lik BTC değişimi, ancak çapraz karşılaştırmadan sonra, en büyük olasılık hala borsaların değişiminden geliyor, bu nedenle aslında, yüksek seviyede kilitlenen fişlerin değişimi sadece 150'den az . Bu transfer dahil olsa bile, toplam kayıp yığınındaki 24.000 doların üzerindeki düşüş 4'ü geçmedi, 200 BTC Bu, ister kısa vadeli bir yükseliş, ister fiyatta düşüş olsun, en büyük oranı kaplayan kaybeden chiplerin tepki vermediği anlamına geliyor.Bu yüzden büyük ölçekli bir düşüş olmayacağına karar vermemin nedeni bu. Hafta sonları kalan düşük volatilite yerine adresler değişiyor. Üstelik, yalnızca erken dönem kâr ve zarar fişlerindeki değişiklikler azalmakla kalmıyor, mevcut anlaşmazlık fiyatı altındaki kısa vadeli işlem fişleri bile fazla yanıt vermedi ve hafta sonu genel satış baskısı hala düşük. Borsaya aktarılan BTC verisine bakılırsa, bu sabah saat 8:00 itibariyle satış baskısı gerçekten de düşmeye devam ediyor, bu da satış için güçlü bir isteklilik olmadığını gösteriyor. Ayrıntılı verilerde, 6:45'te düşmeye başlamasına rağmen, bu dönemde oluşan satış baskısının büyük olmadığı, sadece sabah 8:30'dan sonra ortaya çıkan güçlü satış baskısının olduğu da görülebiliyor. Borsaya aktarılan satış baskısı ile karşılaştırıldığında, borsadan çekilen para miktarı çok fazla değil.Genel satış baskısını karşılayabilse de, bu alım gücü seviyesi şokların durumunu değiştirmek için hala yeterli değil.Fiyat dalgalanıyor likiditenin düşük olduğu hafta sonları. Ayrıntılı verilerden, Pekin saatinden 8:00'den sonra satış baskısındaki artışla birlikte, para çekme sayısının da artmaya başladığı, ancak nispeten konuşursak, bazılarının hazırlıksız yakalandığı görülebilir. Bununla birlikte, genel oyun durumu açısından bakıldığında, satışta çok fazla fiş olmadığı ve satın alma gücü durmadığı için, aksine, aktif olarak satın alıyorlar ve karşılık gelen fişleri devre dışı bırakmaya devam ediyorlar. Bu aynı zamanda fonların reaksiyondan sonra satın alma arzusunun devam ettiğini, bu nedenle büyük ölçekli bir düşüşün gerçekleşmesinin zor olduğunu kanıtlıyor. Sarsıntı hala ana tema. Borsanın BTC hisse senedi verilerinden, hafta sonları düşük tiraj durumunda bile, borsadan kaybolmaya devam eden çok sayıda chip olduğu görülebilir, bu sadece satın alma gücünün çok daha yüksek olduğunu göstermez. satış baskısından ziyade, aynı zamanda mevcut ekonomik fraksiyonu temsil eder.Enflasyonda bir zirve ve fiyatlarda bir dip beklentileri. Hisse senedinin detaylı verilerinden sabah 8:00'den önce borsa hissesinin fiyat düşse bile sürekli düşüşte olduğu görülüyor. Saat sekizden sonra, tamamen farklıydı. Dolayısıyla fiyat düştüğünde genel satışın sabah 6:45'te başlamadığı, tam tersine şu anda daha büyük bir dalgalanma olmadığı açıkça görülüyor. Daha büyük ölçekli bir satış, ancak bu noktadan sonra duyarlılık tarafından yönlendirildi. Mevcut fon miktarının düşük olduğu ve taahhüt kapasitesinin yetersiz olduğu doğru olmakla birlikte, büyük çaplı panik satışlarını tetiklememiştir. Mevcut BTC sürekli sözleşme verilerine bakılırsa, fonlama oranı fiyat düşüşüyle düşüşe geçmedi, bunun yerine büyük ölçekli bir yükseliş hissiyatı var, bu da mevcut hissiyatın daha fazla olduğunu gösteriyor Yatırımcılar bunun sadece aşamalı bir düşüş olduğuna inanıyor. ve ABD enflasyonu zirveye ulaştığında BTC hala dibe vuracak. Aslında, bugünün düşüşü için bir neden yok ve bu sadece hissiyattaki düşüş eğiliminden kaynaklanmıyor çünkü bu Cuma BTC ve ETH opsiyonlarının aylık teslimatı olacak çünkü önceki aylar düşüşte.Durum, fiyat teslimattan önce her zaman en büyük acı noktasından uzaktır, bu nedenle opsiyon teslimatına dikkat eden çok daha az küçük ortak var, özellikle opsiyon satıcıları güçsüz ve bu ay farklı. Temmuz sonunda, BTC opsiyonlarının en büyük acı noktası 23.000 ABD doları ki bu tam olarak bu sabahki düşüşten önceki fiyat.Önceki aylardaki yaklaşık 10.000 ABD doları açıkla karşılaştırıldığında, bu ay aslında bu fırsatı yakalama fırsatı var. en büyük acı noktasına ulaşmak ve aynı zamanda en uzun-kısa oyun yoğun bir durumdur. Mevcut kısa-uzun oran 0,83 ve boğalar küçük bir aralıkta liderliğini sürdürüyor.Mevcut açık opsiyonlar 76.654 ve beklenen miktar yaklaşık 1,7 milyar ABD doları. Dolayısıyla rekabet daha yoğun olacak. ETH'nin en büyük acı noktası sadece 1400 dolar.Mevcut fiyat, son aylarda nadir görülen en büyük acı noktasından hala daha yüksek.Kısa-uzun oranı bile son aylarda 1'den 0'a düştü.
"Merhaba, bir kişilik masanız var mı?" Birkaç müşteriyi oturttuktan sonra hostesin hostes standına ne zaman döndüğünü sordum. "Merhaba, rezervasyon yapılmadıysa barımız var," diye cevapladı hostes, kulağının arkasından gelen başka bir hostes ile konuşmamızı böldü.
Bu gönderi, DFINITY ekibinin merkezi olmayan bulut vizyonunu ve bunun geleneksel blok zinciri ve Amazon Web Servisleri gibi mevcut bulut sağlayıcılarıyla ilişkisini araştırıyor. Büyük ölçekli bir ağ tarafından uygulanan DFINITY teknolojisinin gösterimleri 2017 sonbaharında yapılacak ve bunu, 2018 yazının başlarında piyasaya sürülmesi beklenen “açık bulut” ağıyla kâr amacı gütmeyen vakıf için bir Ana bağış toplama izleyecektir. .