Операция записи царства замораживает экран - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю над приложением, в котором мне нужно сохранять изображения локально, и для этого я использую область, приложение берет, скажем, от 10 до 40 изображений за раз из галереи и начинает записывать изображения в локальную базу данных области и замораживает экран во время записи, плз, как я могу изменить свой код, чтобы мое приложение не зависало во время записи, я застрял в этой ситуации, любая помощь будет признательна, спасибо

let imagesAdd = refObject.1
let imageobjectArray = modelObject as! [FacilitiesImagesModel]
do{
    for imageObject in imageobjectArray{
         try realmObj.write {
              imagesAdd?.facilitiesImages.append(imageObject)
             }
     }

     completionHandler(true, "")

 }catch let err{
      realmObj.cancelWrite()
      completionHandler(false, err.localizedDescription)
 }

здесь мой полный метод, я удалил дополнительный код, который не является частью моего вопроса

struct RealmCRUD {

private let realmObj = try! Realm()

func create<T>(modelObject: T, modelObjectType: ModelType, refObject: (PropertyModel?, FacilitiesModel?), completionHandler: @escaping ((Bool, String) -> Void)){

    switch modelObjectType {



    case .FacilitiesImagesModel:
        let imagesAdd = refObject.1
        let imageobjectArray = modelObject as! [FacilitiesImagesModel]
        do{
            for imageObject in imageobjectArray{
                try realmObj.write {
                    imagesAdd?.facilitiesImages.append(imageObject)
                    }
            }

            completionHandler(true, "")

        }catch let err{
            realmObj.cancelWrite()
            completionHandler(false, err.localizedDescription)
        }
        break
    }

    default:
    break
}

, и я вызываю этот метод из другого класса, как это:

func dismissComplete() {

    var arrayOfFacilitiesImagesModelObj = [FacilitiesImagesModel]()

    for photos in self.selectedAssets{

        if let photo = photos.fullResolutionImage{
            let facilitiesImagesModelObj = FacilitiesImagesModel()
            facilitiesImagesModelObj.facilityPhoto = photo.jpegData(compressionQuality: 0.5)!
            arrayOfFacilitiesImagesModelObj.append(facilitiesImagesModelObj)
        }else{
            print("Unable to select facility photos")
        }

    }

    self.realmCrudObj.create(modelObject: arrayOfFacilitiesImagesModelObj, modelObjectType: .FacilitiesImagesModel, refObject: (nil,self.realmFacilitiesResults), completionHandler: { (success, error)  in

        self.collectionViewReference?.reloadData()

        ProgressHUD.dismiss()

        if !success{
            self.showAlert(title: "Error", description: error)
        }
        })
}

и я я передаю выбранные данные свойства в эту переменную в этом классе

    var realmFacilitiesResults: FacilitiesModel?

вот моя модель объекта

class FacilitiesModel: Object {

@objc dynamic var facilityName = ""

let facilitiesImages = List<FacilitiesImagesModel>()

let parentProperty = LinkingObjects(fromType: PropertyModel.self, property: "facilities")

}

1 Ответ

0 голосов
/ 05 апреля 2020

Частично ваша проблема заключается в том, что вы делаете несколько записей в области. Вы должны сделать одну запись для всех ваших объектов.

do {
    let realm = try Realm()
    try realm.write {
        imagesAdd?.facilitiesImages.append(objectsIn: imageobjectArray)
        completionHandler(true, "")
    } catch {
        print("realm write error: \(error)")
        completionHandler(false, "")
    }
}

Если это все еще не ускоряет вашу работу, то вы должны добавить свои объекты в область в фоновом потоке. Но поскольку вы будете работать в новом потоке, вам придется получать поточно-ориентированные ссылки.

let imageObjectsRefArray = imageObjectsArray.map { ThreadSafeReference(to: $0) }
let imagesAddRef = ThreadSafeReference(to: imagesAdd)
let queue = DispatchQueue(label: "realm.image.add")
queue.async {
    do {
        let realm = try Realm()
        guard let imagesAdd = realm.resolve(imagesAddRef) else {
            completionHandler(false, "")
            return
        }
        let imageObjectsArray = imageObjectsRefArray.compactMap { realm.resolve($0) }
        try realm.write {
            imagesAdd.facilitiesImages.append(objectsIn: imageObjectsArray)
        }
        completionHandler(true, "")
    } catch {
        print("realm write error: \(error)")
        completionHandler(false, "")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...