Оболочка свойств для CurrentValueSubject — управление памятьюIOS

Программируем под IOS
Ответить
Anonymous
 Оболочка свойств для CurrentValueSubject — управление памятью

Сообщение Anonymous »

Я хотел бы создать оболочку свойства для CurrentValueSubject. Я сделал это так:

Код: Выделить всё

@propertyWrapper
public class CurrentValue {

public var wrappedValue: Value {
get { projectedValue.value }
set { projectedValue.value = newValue }
}

public var projectedValue: CurrentValueSubject

public init(wrappedValue: Value) {
self.projectedValue = CurrentValueSubject(wrappedValue)
}

}
Это работает, но я хотел бы кое-что изменить — использовать структуру вместо класса. Проблема с использованием структуры заключается в том, что иногда я мог получить ошибку одновременного доступа. И я знаю почему, это происходит, когда в приемнике от этого издателя я пытаюсь прочитать значение из завернутого значения. Например, с таким кодом:

Код: Выделить всё

@CurrentValue
let test = 1
$test.sink { _ in
print(self.test)
}
И я более или менее знаю почему: когда projectedValue выполняет свое наблюдение, обернутое значение все еще находится в процессе установки своего значения. В классе это нормально, потому что это просто изменит значение, но в случае со struct это фактически изменяет саму структуру, поэтому я пытаюсь писать и читать из нее одновременно.

Мой вопрос: есть ли какой-нибудь умный способ преодолеть это, продолжая использовать структуру? Я не хочу отправлять async.

Кроме того, я знаю, что @Projected работает аналогично этому propertyWrapper, но там это большая разница: Projected выполняется на willSet, а CurrentValueSubject на DidSet. И у Projected та же проблема.

Я знаю, что могу прочитать значение внутри замыкания, но иногда я использую это с различными вызовами функций, которые возможно, в конечном итоге вместо этого будет использовать self.test.

Подробнее здесь: https://stackoverflow.com/questions/608 ... management
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»