<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Selvi Songül Gözlügöl</title>
	<atom:link href="https://selvisongulgozlugol.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://selvisongulgozlugol.com/</link>
	<description>Mobil Geliştirme: Teknolojiler, Mimariler ve Optimizasyonlar</description>
	<lastBuildDate>Sat, 01 Mar 2025 20:11:36 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.7</generator>

<image>
	<url>https://selvisongulgozlugol.com/wp-content/uploads/2025/03/cropped-58B11815-0528-46DC-9DE0-A7225FA96333-Arka-Plani-Silindi-32x32.png</url>
	<title>Selvi Songül Gözlügöl</title>
	<link>https://selvisongulgozlugol.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Rx Swift &#8211; Reaktif Programlama</title>
		<link>https://selvisongulgozlugol.com/rx-swift-reaktif-programlama/</link>
					<comments>https://selvisongulgozlugol.com/rx-swift-reaktif-programlama/#respond</comments>
		
		<dc:creator><![CDATA[Selvi Songül Gözlügöl]]></dc:creator>
		<pubDate>Sun, 23 Feb 2025 14:10:10 +0000</pubDate>
				<category><![CDATA[İleri Seviye Swift]]></category>
		<guid isPermaLink="false">https://selvisongulgozlugol.com/?p=2169</guid>

					<description><![CDATA[<p>RxSwift, Swift için geliştirilmiş reaktif programlama kütüphanesidir ve asenkron veri akışlarını yönetmeyi kolaylaştırır.</p>
<p><a href="https://selvisongulgozlugol.com/rx-swift-reaktif-programlama/">Rx Swift &#8211; Reaktif Programlama</a> yazısı ilk önce <a href="https://selvisongulgozlugol.com">Selvi Songül Gözlügöl</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="2169" class="elementor elementor-2169">
				<div class="elementor-element elementor-element-7d934730 e-flex e-con-boxed e-con e-parent" data-id="7d934730" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-ed0c2af elementor-widget elementor-widget-text-editor" data-id="ed0c2af" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									
<p id="1364">RxSwift, Swift için geliştirilmiş reaktif programlama kütüphanesidir ve asenkron veri akışlarını yönetmeyi kolaylaştırır.</p>

<h2 id="df04" class="wp-block-heading"><strong>Reaktif Programlama Nedir? <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f914.png" alt="🤔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></h2>

<p id="1177">Reaktif programlama, veri akışlarını yönetmeyi sağlayan bir programlama paradigmasıdır. Peki, bu ne demek?</p>

<p id="647a">Şöyle düşün: normalde, bir butona tıkladığında veya bir API isteği tamamlandığında, manuel olarak bir işlem başlatırsın, değil mi? İşte reaktif programlama burada devreye giriyor.</p>

<p id="5237">Reaktif programlama sayesinde, bu tür olayları veri akışları (observable streams) olarak tanımlıyoruz ve sistem bunları otomatik olarak izliyor. Yani, sen olayları sürekli kontrol etmek zorunda kalmadan, onlar gerçekleştiğinde otomatik olarak tepki verebiliyorsun. Bir nevi “benim yerime takip et ve haber ver” diyoruz.</p>

<h2 id="a75a" class="wp-block-heading">RxSwift Nedir?</h2>

<p id="4372">RxSwift, Swift için geliştirilmiş bir reaktif programlama kütüphanesi. Yani, yukarıda bahsettiğimiz veri akışlarını yönetmeyi kolay hale getiriyor.</p>

<p id="33a9">Bunu bir haber ajansı gibi düşün:</p>

<ul class="wp-block-list">
<li>RxSwift sayesinde bir veri kaynağı oluşturuyorsun (mesela bir API’den hava durumu verisi çekiyorsun).</li>

<li>Daha sonra bu veriyi dinleyenleri (observers) ekliyorsun (mesela kullanıcı arayüzü güncelleniyor).</li>

<li>Yeni veri geldiğinde, sistem otomatik olarak haber veriyor ve güncelleniyor.</li>
</ul>

<p id="6422">Özetle, RxSwift UI güncellemeleri, ağ istekleri ve kullanıcı etkileşimlerini yönetirken bizi gereksiz kod yazmaktan kurtaran bir kahraman!</p>

<h2 id="f1f9" class="wp-block-heading"><strong>Observable ve Observer Nedir?</strong></h2>

<ul class="wp-block-list">
<li><strong>Observable (Gözlenen) </strong>→ Bir veri kaynağıdır, yani veri üretir.</li>

<li><strong>Observer (Gözlemci) </strong>→ Bu veriyi alıp işleyenler.</li>
</ul>

<p id="bd03">Bunu bir radyo istasyonu gibi düşünebilirsin; observable, radyo istasyonu ve sürekli müzik yayını yapıyor. Observer, radyoyu açıp müzik dinleyen insanlar.</p>

<p id="48b6">Eğer radyoyu kapatırsan, müzik yayını devam eder ama sen artık dinleyemezsin. RxSwift’te de mantık aynı. Bir observable yayına devam eder ama onu dinleyen biri yoksa bir anlamı kalmaz.</p>

<p id="dc2d"><strong>Swift’te bir Observable nasıl oluşturulur?</strong></p>

<pre class="wp-block-preformatted">import RxSwift<br /><br />let observable = Observable.of("Merhaba", "RxSwift")<br /><br />observable.subscribe { event in<br />    print(event)<br />}</pre>

<p id="2b1d">Observer, Observable’ın yaydığı verileri dinleyen kişidir . Observable bir değer ürettiğinde, Observer bunu yakalar ve belirli işlemleri gerçekleştirir.</p>

<p id="ed41">Bunu garson — müşteri ilişkisi gibi düşünebilirsin:</p>

<p id="032b">• Observable = Bir garson, masalara yemek servisi yapıyor.</p>

<p id="6534">• Observer = Müşteri, garsondan gelen yemeği alıp afiyetle yiyor.</p>

<p id="4980">Garson yeni bir yemek getirdiğinde müşteri bunu alır ve yer (onNext).</p>

<p id="4d2e">Eğer garson yemeği düşürürse bir hata olur (onError).</p>

<p id="70ce">Garson “bu son yemekti, mutfak kapandı” derse siparişler biter (onCompleted).</p>

<p id="4622">İşte Observer, Observable’dan şu olayları dinleyebilir:</p>

<ul class="wp-block-list">
<li><strong>onNext </strong>→ Yeni bir veri geldiğinde çalışır. (Yeni bir yemek geldi.)</li>

<li><strong>onError</strong> → Bir hata oluştuğunda çalışır. (Garson yemeği düşürdü, sipariş iptal!)</li>

<li><strong>onCompleted</strong> → Observable veri göndermeyi bitirdiğinde çalışır. (Restoran kapandı, sipariş bitti.)</li>
</ul>

<p id="e164">Şimdi bunu kod ile nasıl yapacağımıza bakalım;</p>

<pre class="wp-block-preformatted">let observable = Observable.of("Swift", "RxSwift", "Observer")<br /><br />let observer = observable.subscribe(<br />    onNext: { value in<br />        print("Gelen veri: \(value)")<br />    },<br />    onError: { error in<br />        print("Hata oluştu: \(error)")<br />    },<br />    onCompleted: {<br />        print("Observable tamamlandı.")<br />    }<br />)</pre>

<p id="0a4f"><strong>Çıktı:</strong></p>

<pre class="wp-block-preformatted">Gelen veri: Swift  <br />Gelen veri: RxSwift  <br />Gelen veri: Observer  <br />Observable tamamlandı.  </pre>

<h2 id="d882" class="wp-block-heading">Subjects Nedir?</h2>

<p id="1b5a">Subjects, RxSwift’te hem Observable (veri üreten) hem de Observer (veriyi dinleyen) gibi davranabilen özel bir veri türüdür. Yani bir Subject, veri yayabilir ve bu verileri dinleyebilir.</p>

<p id="a855"><strong>Subjects Türleri :</strong></p>

<p id="637c">RxSwift’te dört farklı Subject türü vardır. Bunları daha iyi anlamak için günlük hayattan örneklerle açıklayalım!</p>

<h2 id="1e07" class="wp-block-heading"><strong>PublishSubject</strong></h2>

<p id="75f9">Örneğin; canlı bir radyo yayını düşün. Yayını açtıktan sonra duyduklarını takip edebilirsin, ancak yayına geç katıldıysan, öncesinde ne söylendiğini bilemezsin!</p>

<p id="61d4">Özellikleri :</p>

<ul class="wp-block-list">
<li>Veri yayabilir ve dinleyebilir.</li>

<li>Yeni katılan dinleyiciler (aboneler), yalnızca katıldıktan sonraki verileri alır.</li>

<li>Öncesinde yayılan verileri hatırlamaz.</li>
</ul>

<pre class="wp-block-preformatted">import RxSwift<br /><br />let subject = PublishSubject&lt;String&gt;()<br /><br />subject.onNext("Yayın başladı!") // Bu mesajı kimse dinlemediği için kaybolur.<br /><br />let subscriber1 = subject.subscribe(onNext: { value in<br />    print("1. Dinleyici duydu: \(value)")<br />})<br /><br />subject.onNext("Şimdi çalan şarkı: Emir Can İğrek") // 1. dinleyici duyacak.<br /><br />let subscriber2 = subject.subscribe(onNext: { value in<br />    print("2. Dinleyici duydu: \(value)")<br />})<br /><br />subject.onNext("Yeni şarkı: Sagopa Kajmer") // Her iki dinleyici de duyacak.</pre>

<p id="bfff">Çıktı :</p>

<pre class="wp-block-preformatted"> 1. Dinleyici duydu: Şimdi çalan şarkı: Emir Can İğrek  <br /> 1. Dinleyici duydu: Yeni şarkı: Sagopa Kajmer<br /> 2. Dinleyici duydu: Yeni şarkı: Sagopa Kajmer</pre>

<h2 id="c7a0" class="wp-block-heading"><strong>BehaviorSubject</strong></h2>

<p id="6263">Örneğin; bir WhatsApp grubuna sonradan katıldığını düşün. Gruba girdiğinde, o an en son gönderilen mesajı görebiliyorsun, ama daha öncesini göremiyorsun. Ancak, bundan sonra atılan tüm mesajları da anlık olarak alıyorsun!</p>

<p id="78c6">Özellikleri:</p>

<ul class="wp-block-list">
<li>Son yayılan veriyi hatırlar ve yeni katılanlara ilk olarak bu veriyi gönderir.</li>

<li>Daha sonra gelen tüm yeni verileri de alırsın.</li>

<li>Varsayılan (ilk) bir başlangıç değeri ile başlar.</li>
</ul>

<pre class="wp-block-preformatted">import RxSwift<br /><br />// Başlangıç değeri olan bir BehaviorSubject oluşturuyoruz.<br />let subject = BehaviorSubject(value: "Grup açıldı!")<br /><br />// İlk abone, hemen en son değeri (başlangıç değerini) alır.<br />let subscriber1 = subject.subscribe(onNext: { value in<br />    print(" 1. Kullanıcı gördü: \(value)")<br />})<br /><br />// Yeni bir mesaj ekliyoruz.<br />subject.onNext("Merhaba, burası WhatsApp grubu!")<br /><br />// İkinci kullanıcı gruba sonradan katılıyor.<br />let subscriber2 = subject.subscribe(onNext: { value in<br />    print("2. Kullanıcı gördü: \(value)")<br />})<br /><br />// Yeni bir mesaj daha ekliyoruz.<br />subject.onNext("Akşam yemeği planı yapalım mı?")</pre>

<p id="a51a">Çıktı :</p>

<pre class="wp-block-preformatted"> 1. Kullanıcı gördü: Grup açıldı!  <br /> 1. Kullanıcı gördü: Merhaba, burası WhatsApp grubu!  <br /> 2. Kullanıcı gördü: Merhaba, burası WhatsApp grubu!  <br /> 1. Kullanıcı gördü: Akşam yemeği planı yapalım mı?  <br /> 2. Kullanıcı gördü: Akşam yemeği planı yapalım mı?  </pre>

<h2 id="b0b0" class="wp-block-heading"><strong>ReplaySubject</strong></h2>

<p id="8349">Örneğin: bir YouTube oynatma listesi düşün. Listeye yeni bir kişi katıldığında, önceki videoların tamamını izleyebilir ve ardından yeni eklenen videoları da izlemeye devam edebilir!</p>

<p id="733e">Özellikleri:</p>

<ul class="wp-block-list">
<li>Kaç veri saklayacağını sen belirleyebilirsin. (bufferSize : 2 olarak belirledik.)</li>

<li>Yeni katılanlar (aboneler) önce saklanan eski verileri alır, sonra gelen verileri de izlemeye devam eder.</li>

<li>Tüm geçmişi saklayan bir Observable gibi davranır.</li>
</ul>

<pre class="wp-block-preformatted">import RxSwift<br /><br />// ReplaySubject oluşturuyoruz ve en fazla 2 eski değeri saklamasını sağlıyoruz.<br />let subject = ReplaySubject&lt;String&gt;.create(bufferSize: 2)<br /><br />subject.onNext("Video 1: Giriş")<br />subject.onNext("Video 2: RxSwift Temelleri")<br />subject.onNext("Video 3: Subjects Nedir?")<br /><br />// İlk kullanıcı katılıyor.<br />let subscriber1 = subject.subscribe(onNext: { value in<br />    print(" 1. Kullanıcı izledi: \(value)")<br />})<br /><br />// Yeni bir video ekleniyor.<br />subject.onNext("Video 4: Operatörler")<br /><br />// İkinci kullanıcı gruba sonradan katılıyor.<br />let subscriber2 = subject.subscribe(onNext: { value in<br />    print(" 2. Kullanıcı izledi: \(value)")<br />})</pre>

<p id="3d95">Çıktı :</p>

<pre class="wp-block-preformatted">1. Kullanıcı izledi: Video 2: RxSwift Temelleri  <br />1. Kullanıcı izledi: Video 3: Subjects Nedir?  <br />1. Kullanıcı izledi: Video 4: Operatörler  <br />2. Kullanıcı izledi: Video 3: Subjects Nedir?  <br />2. Kullanıcı izledi: Video 4: Operatörler  </pre>

<h2 id="4238" class="wp-block-heading"><strong>AsyncSubject</strong></h2>

<p id="1b12">Örneğin: bir sınav sonuçlarını düşün. Öğrenciler sınava giriyor, kağıtlarını teslim ediyor, ama sonuçlar açıklanana kadar kimse bir şey öğrenemiyor. Sonuç açıklandığında herkes sadece en son sonucu görüyor.</p>

<p id="c793">Özellikleri:</p>

<ul class="wp-block-list">
<li>Sadece en son yayılan değeri saklar.</li>

<li>Ancak, sadece tamamlandığında (onCompleted) bu değeri dinleyicilere iletir.</li>

<li>Tamamlanmazsa (onCompleted çağrılmazsa), hiçbir veri gönderilmez.</li>
</ul>

<pre class="wp-block-preformatted">import RxSwift<br /><br />let subject = AsyncSubject&lt;String&gt;()<br /><br />// İlk abonemiz konuya dahil oluyor ama şu an hiçbir veri alamaz.<br />let subscriber1 = subject.subscribe(onNext: { value in<br />    print(" 1. Kullanıcı gördü: \(value)")<br />})<br /><br />// Veri yayılıyor, ancak henüz kimseye iletilmiyor.<br />subject.onNext("Veri 1: 10")<br />subject.onNext("Veri 2: 20")<br />subject.onNext("Veri 3: 30") // Bu son veri, ancak hala kimse göremedi!<br /><br />// Şimdi tamamlandığını belirtiyoruz.<br />subject.onCompleted()<br /><br />// Yeni bir abone geliyor.<br />let subscriber2 = subject.subscribe(onNext: { value in<br />    print("2. Kullanıcı gördü: \(value)")<br />})</pre>

<p id="88b5">Çıktı:</p>

<pre class="wp-block-preformatted"> 1. Kullanıcı gördü: Veri 3: 30  <br /> 2. Kullanıcı gördü: Veri 3: 30  </pre>

<h2 id="102b" class="wp-block-heading"><strong>Hangi subject türü</strong> n<strong>e zaman kullanılır?</strong></h2>

<figure class="wp-block-image"><img decoding="async" src="https://miro.medium.com/v2/resize:fit:1400/1*SHg-bPTWVNa09mYbm11VHw.png" alt="" /></figure>

<h2 id="67eb" class="wp-block-heading"><strong>RxSwift ile UI Güncellemeleri</strong></h2>

<p id="c5fb">RxSwift, UI değişikliklerini yönetmek için harika bir araçtır. Normalde, delegate, NotificationCenter veya closure kullanarak UI’yi güncelleriz. Ancak, RxSwift sayesinde veri akışlarını doğrudan UI bileşenlerine bağlayabiliriz!</p>

<p id="541e">Şimdi, UIButton, UILabel, UITextField ve UITableView gibi bileşenleri RxSwift ile nasıl güncelleyebileceğimizi adım adım inceleyeceğiz.</p>

<p id="1f7a">Örnek: Buton tıklanınca UILabel güncelleme</p>

<pre class="wp-block-preformatted">import UIKit<br />import RxSwift<br />import RxCocoa<br /><br />class ViewController: UIViewController {<br />    let disposeBag = DisposeBag()<br />    <br />    let button = UIButton()<br />    let label = UILabel()<br /><br />    override func viewDidLoad() {<br />        super.viewDidLoad()<br /><br />        // Buton tıklamalarını dinleyerek Label'ı güncelle<br />        button.rx.tap<br />            .map { "Butona tıklandı! " }<br />            .bind(to: label.rx.text)<br />            .disposed(by: disposeBag)<br />    }<br />}</pre>

<p id="a290">Örnek: Kullanıcının yazdığı metni anlık olarak bir UILabel’e yansıtma</p>

<pre class="wp-block-preformatted">let textField = UITextField()<br />let label = UILabel()<br /><br />textField.rx.text<br />    .orEmpty // Optional'ı kaldır<br />    .bind(to: label.rx.text) // Doğrudan bağla<br />    .disposed(by: disposeBag)</pre>

<p id="3ef2">Örnek: Basit bir UITableView Veri Bağlama</p>

<pre class="wp-block-preformatted">let tableView = UITableView()<br />let items = Observable.just(["Elma", "Muz", "Karpuz"])<br /><br />items.bind(to: tableView.rx.items) { (tableView, row, item) in<br />    let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")<br />    cell.textLabel?.text = item<br />    return cell<br />}<br />.disposed(by: disposeBag)</pre>

<h1 id="e56b" class="wp-block-heading">DisposeBag ve Bellek Yönetimi</h1>

<p id="4973">RxSwift kullanırken bellek yönetimi (Memory Management) çok kritik bir konudur. Eğer dikkat etmezsek, memory leak (bellek sızıntısı) oluşabilir ve uygulamamız gereksiz RAM tüketir. Bu da uygulamanın yavaşlamasına ve hatta çökmesine yol açabilir.</p>

<p id="7874"><strong>DisposeBag Nedir?</strong></p>

<p id="2402">DisposeBag, RxSwift’te aboneliklerin (subscriptions) yönetilmesini sağlayan bir araçtır. İçine eklenen abonelikler, ViewController yok edildiğinde otomatik olarak iptal edilir (dispose edilir).</p>

<p id="be07"><strong>Peki neden önemli?</strong></p>

<p id="e48a">Normalde bir Observable’a abone olduğumuzda (subscribe), bu abonelik aktif kalmaya devam eder ve manuel olarak iptal etmezsek (dispose etmezsek), bellekte gereksiz yer kaplamaya devam eder. İşte DisposeBag, bunu otomatik olarak yönetir.</p>

<p id="212b">DisposeBag Kullanımı :</p>

<pre class="wp-block-preformatted">import UIKit<br />import RxSwift<br /><br />class ViewController: UIViewController {<br />    let disposeBag = DisposeBag() // DisposeBag oluştur<br /><br />    override func viewDidLoad() {<br />        super.viewDidLoad()<br /><br />        let observable = Observable.of("Merhaba RxSwift!")<br /><br />        observable.subscribe(onNext: { value in<br />            print(value) // "Merhaba RxSwift!" yazdır<br />        })<br />        .disposed(by: disposeBag) // DisposeBag içine ekledik!<br />    }<br />}</pre>

<p id="bd1d">Sonuç?</p>

<p id="0080">ViewController yok edildiğinde (deinit çağrıldığında), içindeki abonelikler de otomatik olarak sonlandırılacak ve bellek sızıntısı önlenecek!</p>

<p id="b553"><strong>Memory Leak (Bellek Sızıntısı) Nasıl Önlenir? <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></p>

<p id="ca60">Bazı durumlarda DisposeBag kullanmak yetmez. Özellikle kendi içinde self kullanan closure’lar, ViewController’ı bellekten temizlenmesini engelleyebilir. Bu durumu çözmek için <strong>[weak self] </strong>veya <strong>[unowned self] </strong>kullanabiliriz.</p>

<p id="744a">Örnek: Memory Leak Oluşturan Kod</p>

<pre class="wp-block-preformatted">observable.subscribe(onNext: { value in<br />    self.updateUI(value) // SELF burada döngüye sebep olabilir!<br />})<br />.disposed(by: disposeBag)</pre>

<p id="84f5">Sorun ne?</p>

<ul class="wp-block-list">
<li>Closure içindeki self doğrudan kullanıldığı için, ViewController kendini bellekten temizleyemez ve memory leak oluşur.</li>
</ul>

<p id="1d4f">Çözüm: [weak self] Kullanımı</p>

<pre class="wp-block-preformatted">observable.subscribe(onNext: { [weak self] value in<br />    self?.updateUI(value) // Self artık weak reference, memory leak oluşmaz!<br />})<br />.disposed(by: disposeBag)</pre>

<p id="5a2c">Ne değişti?</p>

<ul class="wp-block-list">
<li>[weak self] sayesinde ViewController bellekten silindiğinde, closure da kendini otomatik olarak iptal eder.</li>

<li>Memory leak önlendi!</li>
</ul>

<h2 id="5df5" class="wp-block-heading">Sonuç</h2>

<p id="74cb">RxSwift başta biraz kafa karıştırıcı gelebilir ama alışınca gerçekten kodu daha düzenli ve yönetilebilir hale getiriyor. UI ile entegrasyonu, veri akışlarını yönetmesi, asenkron işlemleri basitleştirmesi derken, bir süre sonra “Ben daha önce nasıl kod yazıyordum?” dedirtebilir.</p>

<p id="75e4">Bir başka yazıda görüşene dek hoşçakalın! <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f64b-1f3fb-200d-2640-fe0f.png" alt="🙋🏻‍♀️" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>

<p> </p>
								</div>
				</div>
					</div>
				</div>
				</div>
		<p><a href="https://selvisongulgozlugol.com/rx-swift-reaktif-programlama/">Rx Swift &#8211; Reaktif Programlama</a> yazısı ilk önce <a href="https://selvisongulgozlugol.com">Selvi Songül Gözlügöl</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://selvisongulgozlugol.com/rx-swift-reaktif-programlama/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>UserDefaults</title>
		<link>https://selvisongulgozlugol.com/https-github-com-selvisongulgozlugol-ios-development/</link>
					<comments>https://selvisongulgozlugol.com/https-github-com-selvisongulgozlugol-ios-development/#respond</comments>
		
		<dc:creator><![CDATA[Selvi Songül Gözlügöl]]></dc:creator>
		<pubDate>Mon, 11 Nov 2024 07:32:00 +0000</pubDate>
				<category><![CDATA[Swift Temelleri]]></category>
		<guid isPermaLink="false">https://wp.dynamiclayers.net/softgen-importer/?p=828</guid>

					<description><![CDATA[<p>UserDefaults kullanarak uygulamalarınızda küçük boyutlu veriler için basit bir depolama alanı oluşturmayı öğrenelim.</p>
<p><a href="https://selvisongulgozlugol.com/https-github-com-selvisongulgozlugol-ios-development/">UserDefaults</a> yazısı ilk önce <a href="https://selvisongulgozlugol.com">Selvi Songül Gözlügöl</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="4394">UserDefaults Nedir?</h2>



<p id="5e13">UserDefaults, iOS uygulamalarında küçük ve önemli bilgileri kalıcı olarak saklamanın en kolay yollarından biridir. Kullanıcı ayarları, uygulama tercihleri ya da ufak tefek bilgileri kaydetmek için oldukça kullanışlıdır. Mesela, kullanıcı karanlık tema seçeneğini açtıysa veya belirli bir giriş bilgisi girdiyse, bu bilgileri UserDefaults ile saklayabilirsiniz. Böylece uygulama kapatılıp tekrar açıldığında bile bu ayarları hatırlamış olur, kullanıcı her seferinde aynı şeyleri tekrar yapmak zorunda kalmaz.</p>



<h2 class="wp-block-heading" id="3644">Pekii Neden UserDefaults Kullanmalıyız? <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f914.png" alt="🤔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h2>



<p id="388f">Uygulamalarımızda bazen küçük ama sürekli ihtiyacımız olan bilgileri kaydetmemiz gerekebilir. Bu durumda büyük bir veritabanına gerek kalmadan UserDefaults işimizi görebilir. Örneğin, bir hava durumu uygulaması yaptığınızı düşünün; kullanıcı en son İstanbul’a baktıysa, bu bilgiyi UserDefaults ile saklayabilirsiniz. Böylece uygulama tekrar açıldığında kullanıcı direkt olarak İstanbul’un hava durumunu görür.</p>



<p id="fdaf">Aynı şekilde, kullanıcı ayarlarını saklamak için de çok kullanışlıdır. Mesela uygulamanızda bir “karanlık mod” seçeneği varsa, kullanıcı bu modu seçtiğinde bilgiyi UserDefaults’a kaydedebilirsiniz. Böylece uygulama her açıldığında kullanıcı ayarı tekrar yapmak zorunda kalmaz; uygulama otomatik olarak karanlık modda açılır.</p>



<h2 class="wp-block-heading" id="aea6">UserDefaults ile Hangi Tür Verileri Kaydedebiliriz?</h2>



<p id="2114">UserDefaults ile&nbsp;<strong>Bool</strong>,&nbsp;<strong>Float</strong>,&nbsp;<strong>Double</strong>,&nbsp;<strong>Int</strong>,&nbsp;<strong>String</strong>&nbsp;ve&nbsp;<strong>URL</strong>&nbsp;gibi temel veri tiplerini saklayabilirsiniz. Bunların yanı sıra daha karmaşık veri tiplerini de destekler; örneğin&nbsp;<strong>diziler (Array)</strong>,&nbsp;<strong>sözlükler (Dictionary)</strong>,&nbsp;<strong>tarih (Date)</strong>&nbsp;ve&nbsp;<strong>Data</strong>&nbsp;verilerini de UserDefaults’a kaydedebilirsiniz. Böylece, uygulamanızda birçok farklı türde bilgiyi kolayca saklayabilirsiniz.</p>



<p id="f496">Unutmayın ki UserDefaults hızlı ve kolay bir yöntemdir, ancak çok fazla veri kaydetmek uygulamanın yüklenme süresini yavaşlatabilir. Sakladığınız veriler 100KB(≈)’yi geçiyorsa, UserDefaults yerine daha kapsamlı veri depolama çözümlerini düşünmek daha iyi olur.</p>



<p id="a318">Kısacası, UserDefaults uygulamanızda küçük ama önemli bilgileri saklamak için idealdir. Daha büyük veri ihtiyaçlarınız için ise daha güçlü çözümler kullanmak her zaman daha sağlıklıdır.</p>



<h2 class="wp-block-heading" id="9dbb">UserDefaults Fonksiyonun Temel Kullanımı Nasıldır? <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f469-1f3fb-200d-1f4bb.png" alt="👩🏻‍💻" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h2>



<pre class="wp-block-preformatted">UserDefaults.standard.set(value: Any?, forKey: String) </pre>



<p id="597f">UserDefaults’ta veri saklamak için iki temel bilgiye ihtiyacınız var:&nbsp;<strong>value</strong>&nbsp;ve&nbsp;<strong>forKey</strong>. Value, saklamak istediğiniz veriyi ifade ederken, forKey ise bu veriyi daha sonra bulabilmek için kullanacağınız anahtardır.</p>



<p id="7ed8">Örnek olarak; dark(koyu) mode tercihinin kaydedilmesi;</p>



<pre class="wp-block-preformatted"><br>UserDefaults.standard.set(true, forKey: "isDarkModeEnabled")</pre>



<h2 class="wp-block-heading" id="dbe0">UserDefults Veri Çekme :</h2>



<p id="64c4">Kaydettiğiniz veriyi geri almak oldukça basittir.&nbsp;<code>value(forKey:)</code>&nbsp;veya&nbsp;<code>object(forKey:)</code>&nbsp;kullanarak kolayca erişebilirsiniz. Örneğin, daha önce kaydettiğimiz koyu mod bilgisini çekmek istiyorsak;</p>



<pre class="wp-block-preformatted">UserDefaults.standard.value(forKey: "isDarkModeEnabled")</pre>



<h2 class="wp-block-heading" id="2113">Dipnot <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/2757.png" alt="❗" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h2>



<p id="84c5">Swift’te&nbsp;<code>UserDefaults</code>&nbsp;kullanarak kaydettiğimiz bir veriyi okurken, türün doğru olup olmadığını kontrol etmemiz gerekebilir. Bu durumda iki temel seçeneğimiz var:</p>



<p id="b817"><strong>as!&nbsp;</strong>ile zorunlu (forced) bir dönüşüm yapmak</p>



<p id="2651"><strong>as?</strong>&nbsp;ile daha güvenli bir dönüşüm yapmak</p>



<h2 class="wp-block-heading" id="aa7f">as! ve as? Kullanımı</h2>



<p id="5d11"><strong>as!</strong>&nbsp;ile veri tipini zorlayarak dönüştürebiliriz. Ama burada dikkat etmeliyiz; eğer object(forKey:) nil dönerse uygulama çöker.<img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f631.png" alt="😱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Bu yüzden&nbsp;<strong>as!</strong>&nbsp;riskli olabilir.</p>



<p id="d754"><strong>as?</strong>&nbsp;ise daha güvenlidir, çünkü dönüşüm başarısız olursa nil döner. Ancak,&nbsp;<strong>as?</strong>&nbsp;kullandığınızda veriyi sürekli açmak (unwrap) veya bir varsayılan değer eklemek gerekebilir. Bu da bazen kodu biraz karışık hale getirebilir.</p>



<h2 class="wp-block-heading" id="cf0a">Nil Coalescing Operatörü (??) ile Kolay Çözüm <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f62e-200d-1f4a8.png" alt="😮‍💨" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h2>



<p id="9f48">Neyse ki Swift bu konuda işimizi kolaylaştırıyor. Nil coalescing operatörü (??), opsiyonel bir değeri kolayca açmamızı veya nil ise varsayılan bir değer eklememizi sağlar.</p>



<p id="2358">Örneğin: Diyelim ki UserDefaults içine daha önce “favoriteColors” adlı bir dizi kaydettiniz ve bu diziyi geri almak istiyorsunuz. İşte bunu nil coalescing operatörüyle şu şekilde yapabilirsiniz:</p>



<pre class="wp-block-preformatted"><code>let favoriteColors = UserDefaults.standard.object(forKey: "favoriteColors") as? [String] ?? []</code></pre>



<p id="32db">Bu kodda, “favoriteColors” anahtarında bir veri varsa ve [String] dönüşümü başarılıysa, favoriteColors olarak atanıyor. Eğer değer nil dönerse veya dönüşüm başarısız olursa, sağdaki boş dizi [] atanıyor. Bu sayede, hem güvenli hem de temiz bir şekilde veriyi almış oluyoruz; ekstra bir açma işlemi veya varsayılan değer belirleme ihtiyacı kalmıyor.</p>



<p id="513f">Özetle ?? ile opsiyonel bir değeri tek satırda açabilir veya nil durumunda varsayılan bir değer atayabilirsiniz.</p>



<p class="has-text-align-center">&#8230;</p>



<p id="f9ef">Umarım UserDefaults’u kullanırken işinizi kolaylaştıracak bilgiler verebilmişimdir. Sağlıcakla kalın! <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f44b-1f3fb.png" alt="👋🏻" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p></p>
<p><a href="https://selvisongulgozlugol.com/https-github-com-selvisongulgozlugol-ios-development/">UserDefaults</a> yazısı ilk önce <a href="https://selvisongulgozlugol.com">Selvi Songül Gözlügöl</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://selvisongulgozlugol.com/https-github-com-selvisongulgozlugol-ios-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
