iOS'in iç işleyişi hakkında derinlemesine bilgiye sahip değilim ancak bunun, kullanılan API fonksiyonlarının döndürdüğü nesne türüyle ilgili olabileceğinden şüpheleniyorum.
Başka bir deyişle, döndürülen nesne henüz görselin kendisi olmayabilir; bunun yerine, asıl bitmap'i oluşturmak için işlenmesi gereken ham veri olabilir.
PHPicker ile çalışırken, bir görselin yüklenip yüklenemeyeceğini kontrol etmek için Apple'ın önerdiği yaklaşım, doğrudan `UIImage` sınıfını kontrol etmek yerine `kUTTypeImage` (veya eşdeğer iOS tanımlayıcısı) kullanmaktır. Bunun nedeni, `itemProvider`ın görseli henüz bellekte `UIImage` formatında olmayan ancak `UIImage`e dönüştürülebilir bir formatta tutuyor olabilmesidir.
Önerilen çözüm: `canLoadObjectOfClass(TUIImage.OCClass)` kullanmak yerine, standart görsel türüyle birlikte `hasItemConformingToTypeIdentifier` kullanmalıyız.
Bunun sorununuzu neden çözmesi gerektiği:
Çalışma Zamanı Güvenliği: `hasItemConformingToTypeIdentifier`, bir öğenin dönüştürülebilir olduğundan emin olmak için kullanılan Apple'ın yerel (native) metodudur. Delphi'deki doğrudan `canLoadObjectOfClass` kontrolüne kıyasla çok daha sağlamdır ve bellek erişim ihlallerine yol açma ihtimali daha düşüktür.
Uyumluluk: `UTTypeImage`, PHPicker tarafından sağlanan tüm görsel türlerini kapsayan doğru sabittir (constant).
Önemli uygulama noktaları:
Bellek Yönetimi: İkinci denemenizde `Dump.Free` ekleyerek doğru olanı yaptınız. Bunu yapmaya devam edin.
Yürütme İş Parçacığı (Thread): `TThread.Synchronize` kullanma fikriniz doğru. `loadObjectOfClass` asenkrondur ve arka plan iş parçacığında çalışır. Ana iş parçacığı dışından Delphi görsel bileşenlerine (örneğin `FOwner.Resim_list`) erişmeye çalışmak, FMX'teki çökmelerin bir numaralı nedenidir.
Nil Kontrolleri: Mevcut nil kontrollerinizi koruyun; çünkü Delphi köprüsü (bridge) aracılığıyla iOS üzerindeki nesne yaşam döngüsü değişken olabilir.
NOT: Portekizceden Türkçeye çeviri için Google Translate kullanılmıştır.
Yerel Android Fotoğraf Seçici'yi (Photo Picker) kullanarak Android için hazırladığım bir örnek var; belki iOS konusunda size yardımcı olabilir.
Genel olarak Delphi hakkındaki kanalıma abone olmaktan ve videolarımı beğenmekten çekinmeyin. Mümkünse, lütfen diğer yazılımcı arkadaşlarınıza da tavsiye edin!
Using native PickerPhoto from Android
https://www.youtube.com/watch?v=6lp6xiUILAg
my Youtube channel:
"www.youtube.com/@emailx45"
Başka bir deyişle, döndürülen nesne henüz görselin kendisi olmayabilir; bunun yerine, asıl bitmap'i oluşturmak için işlenmesi gereken ham veri olabilir.
PHPicker ile çalışırken, bir görselin yüklenip yüklenemeyeceğini kontrol etmek için Apple'ın önerdiği yaklaşım, doğrudan `UIImage` sınıfını kontrol etmek yerine `kUTTypeImage` (veya eşdeğer iOS tanımlayıcısı) kullanmaktır. Bunun nedeni, `itemProvider`ın görseli henüz bellekte `UIImage` formatında olmayan ancak `UIImage`e dönüştürülebilir bir formatta tutuyor olabilmesidir.
Önerilen çözüm: `canLoadObjectOfClass(TUIImage.OCClass)` kullanmak yerine, standart görsel türüyle birlikte `hasItemConformingToTypeIdentifier` kullanmalıyız.
Kod: (Select All)
// iOSapi.UniformTypeIdentifiers veya iOSapi.MobileCoreServices birimini kullanın.
uses
iOSapi.UniformTypeIdentifiers, iOSapi.Foundation;
// ... döngünüzün içinde:
if (ResultItem <> nil) and (ResultItem.itemProvider <> nil) then
begin
// canLoadObjectOfClass yerine bir UTI (Uniform Type Identifier) kontrolü kullanın.
if ResultItem.itemProvider.hasItemConformingToTypeIdentifier(UTTypeImage) then
ResultItem.itemProvider.loadObjectOfClass(TUIImage.OCClass, LoadCompleted);
// else ...
end;Bunun sorununuzu neden çözmesi gerektiği:
Çalışma Zamanı Güvenliği: `hasItemConformingToTypeIdentifier`, bir öğenin dönüştürülebilir olduğundan emin olmak için kullanılan Apple'ın yerel (native) metodudur. Delphi'deki doğrudan `canLoadObjectOfClass` kontrolüne kıyasla çok daha sağlamdır ve bellek erişim ihlallerine yol açma ihtimali daha düşüktür.
Uyumluluk: `UTTypeImage`, PHPicker tarafından sağlanan tüm görsel türlerini kapsayan doğru sabittir (constant).
Önemli uygulama noktaları:
Bellek Yönetimi: İkinci denemenizde `Dump.Free` ekleyerek doğru olanı yaptınız. Bunu yapmaya devam edin.
Yürütme İş Parçacığı (Thread): `TThread.Synchronize` kullanma fikriniz doğru. `loadObjectOfClass` asenkrondur ve arka plan iş parçacığında çalışır. Ana iş parçacığı dışından Delphi görsel bileşenlerine (örneğin `FOwner.Resim_list`) erişmeye çalışmak, FMX'teki çökmelerin bir numaralı nedenidir.
Nil Kontrolleri: Mevcut nil kontrollerinizi koruyun; çünkü Delphi köprüsü (bridge) aracılığıyla iOS üzerindeki nesne yaşam döngüsü değişken olabilir.
NOT: Portekizceden Türkçeye çeviri için Google Translate kullanılmıştır.
Yerel Android Fotoğraf Seçici'yi (Photo Picker) kullanarak Android için hazırladığım bir örnek var; belki iOS konusunda size yardımcı olabilir.
Genel olarak Delphi hakkındaki kanalıma abone olmaktan ve videolarımı beğenmekten çekinmeyin. Mümkünse, lütfen diğer yazılımcı arkadaşlarınıza da tavsiye edin!
Using native PickerPhoto from Android
https://www.youtube.com/watch?v=6lp6xiUILAg
my Youtube channel:
"www.youtube.com/@emailx45"
MSWindows, Android, RAD Studio 13 Florence ve kafamda bir fikir

