pub struct CKSyncEngineState { /* private fields */ }CKSyncEngineState only.Expand description
An object that tracks some state required for proper and efficient operation of CKSyncEngine-5sie5.
CKSyncEngine-5sie5 needs to track several things in order to properly sync.
For example, it needs to remember the last server change tokens for your database and zones.
It also needs to keep track of things like the last known user record ID and other various pieces of state.
A lot of this state is hidden internally, but some of it you can control.
§Pending changes
One of the main things you can control is the list of pending changes to send to the server.
You can control these by calling functions like addPendingDatabaseChanges: and addPendingRecordZoneChanges:.
When you add new pending changes, the sync engine will automatically schedule a task to sync with the server.
§State serialization
CKSyncEngine-5sie5 will occasionally update its state in the background.
When it updates its state, your delegate will receive a CKSyncEngineStateUpdateEvent.
This event will contain a CKSyncEngineStateSerialization, which you should persist locally.
The next time your process launches, you initialize your sync engine with the last state serialization you received.
See also Apple’s documentation
Implementations§
Source§impl CKSyncEngineState
impl CKSyncEngineState
pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>
pub unsafe fn new() -> Retained<Self>
Sourcepub unsafe fn pendingRecordZoneChanges(
&self,
) -> Retained<NSArray<CKSyncEnginePendingRecordZoneChange>>
pub unsafe fn pendingRecordZoneChanges( &self, ) -> Retained<NSArray<CKSyncEnginePendingRecordZoneChange>>
A list of record changes that need to be sent to the server.
CKSyncEngine-5sie5 provides the convenience of tracking your pending record zone changes.
When the user makes some changes that need to be sent to the server, you can track them in this list.
Then, you can use this list when creating your next CKSyncEngineRecordZoneChangeBatch in your CKSyncEngineDelegate-1q7g8.
The sync engine will ensure consistency and deduplicate these pending changes under the hood.
For example, if you add a pending save for record A, then record B, then record A again, this will result in a list of [saveRecordA, saveRecordB].
Similarly, if you add a pending save for record A, then add a pending delete for the same record A, this will result in a single pending change of [deleteRecordA].
The sync engine will manage this list while it sends changes to the server. For example, when it successfully saves a record, it will remove that change from this list. If it fails to send a change due to some retryable error (e.g. a network failure), it will keep that change in this list.
If you’d prefer to track pending changes yourself, you can use CKSyncEngine/State/hasPendingUntrackedChanges instead.
Sourcepub unsafe fn pendingDatabaseChanges(
&self,
) -> Retained<NSArray<CKSyncEnginePendingDatabaseChange>>
pub unsafe fn pendingDatabaseChanges( &self, ) -> Retained<NSArray<CKSyncEnginePendingDatabaseChange>>
A list of database changes that need to be sent to the server, similar to pendingRecordZoneChanges.
Sourcepub unsafe fn hasPendingUntrackedChanges(&self) -> bool
pub unsafe fn hasPendingUntrackedChanges(&self) -> bool
This represents whether or not you have pending changes to send to the server that aren’t tracked in CKSyncEngine/State/pendingRecordZoneChanges.
This is useful if you want to track pending changes in your own local database instead of the sync engine state.
When this property is set, the sync engine will automatically schedule a sync.
When the sync task runs, it will ask your delegate for pending changes in CKSyncEngineDelegate/nextRecordZoneChangeBatch(_:syncEngine:).
Sourcepub unsafe fn setHasPendingUntrackedChanges(
&self,
has_pending_untracked_changes: bool,
)
pub unsafe fn setHasPendingUntrackedChanges( &self, has_pending_untracked_changes: bool, )
Setter for hasPendingUntrackedChanges.
Sourcepub unsafe fn zoneIDsWithUnfetchedServerChanges(
&self,
) -> Retained<NSArray<CKRecordZoneID>>
Available on crate feature CKRecordZoneID only.
pub unsafe fn zoneIDsWithUnfetchedServerChanges( &self, ) -> Retained<NSArray<CKRecordZoneID>>
CKRecordZoneID only.The list of zone IDs that have new changes to fetch from the server.
CKSyncEngine-5sie5 keeps track of these zones and will update this list as it receives new information.
Sourcepub unsafe fn addPendingRecordZoneChanges(
&self,
changes: &NSArray<CKSyncEnginePendingRecordZoneChange>,
)
pub unsafe fn addPendingRecordZoneChanges( &self, changes: &NSArray<CKSyncEnginePendingRecordZoneChange>, )
Adds to the list of pending record zone changes.
When you add a new pending change, the sync engine will automatically schedule a sync task.
The sync engine will ensure consistency and deduplicate these changes under the hood.
Sourcepub unsafe fn removePendingRecordZoneChanges(
&self,
changes: &NSArray<CKSyncEnginePendingRecordZoneChange>,
)
pub unsafe fn removePendingRecordZoneChanges( &self, changes: &NSArray<CKSyncEnginePendingRecordZoneChange>, )
Removes from the list of pending record zone changes.
Sourcepub unsafe fn addPendingDatabaseChanges(
&self,
changes: &NSArray<CKSyncEnginePendingDatabaseChange>,
)
pub unsafe fn addPendingDatabaseChanges( &self, changes: &NSArray<CKSyncEnginePendingDatabaseChange>, )
Adds to the list of pending database changes.
When you add a new pending change, the sync engine will automatically schedule a sync task.
The sync engine will ensure consistency and deduplicate these changes under the hood.
Sourcepub unsafe fn removePendingDatabaseChanges(
&self,
changes: &NSArray<CKSyncEnginePendingDatabaseChange>,
)
pub unsafe fn removePendingDatabaseChanges( &self, changes: &NSArray<CKSyncEnginePendingDatabaseChange>, )
Removes from the list of pending database changes.
Methods from Deref<Target = NSObject>§
Sourcepub fn doesNotRecognizeSelector(&self, sel: Sel) -> !
pub fn doesNotRecognizeSelector(&self, sel: Sel) -> !
Handle messages the object doesn’t recognize.
See Apple’s documentation for details.
Methods from Deref<Target = AnyObject>§
Sourcepub fn class(&self) -> &'static AnyClass
pub fn class(&self) -> &'static AnyClass
Dynamically find the class of this object.
§Panics
May panic if the object is invalid (which may be the case for objects
returned from unavailable init/new methods).
§Example
Check that an instance of NSObject has the precise class NSObject.
use objc2::ClassType;
use objc2::runtime::NSObject;
let obj = NSObject::new();
assert_eq!(obj.class(), NSObject::class());Sourcepub unsafe fn get_ivar<T>(&self, name: &str) -> &Twhere
T: Encode,
👎Deprecated: this is difficult to use correctly, use Ivar::load instead.
pub unsafe fn get_ivar<T>(&self, name: &str) -> &Twhere
T: Encode,
Ivar::load instead.Use Ivar::load instead.
§Safety
The object must have an instance variable with the given name, and it
must be of type T.
See Ivar::load_ptr for details surrounding this.
Sourcepub fn downcast_ref<T>(&self) -> Option<&T>where
T: DowncastTarget,
pub fn downcast_ref<T>(&self) -> Option<&T>where
T: DowncastTarget,
Attempt to downcast the object to a class of type T.
This is the reference-variant. Use Retained::downcast if you want
to convert a retained object to another type.
§Mutable classes
Some classes have immutable and mutable variants, such as NSString
and NSMutableString.
When some Objective-C API signature says it gives you an immutable class, it generally expects you to not mutate that, even though it may technically be mutable “under the hood”.
So using this method to convert a NSString to a NSMutableString,
while not unsound, is generally frowned upon unless you created the
string yourself, or the API explicitly documents the string to be
mutable.
See Apple’s documentation on mutability and on
isKindOfClass: for more details.
§Generic classes
Objective-C generics are called “lightweight generics”, and that’s because they aren’t exposed in the runtime. This makes it impossible to safely downcast to generic collections, so this is disallowed by this method.
You can, however, safely downcast to generic collections where all the
type-parameters are AnyObject.
§Panics
This works internally by calling isKindOfClass:. That means that the
object must have the instance method of that name, and an exception
will be thrown (if CoreFoundation is linked) or the process will abort
if that is not the case. In the vast majority of cases, you don’t need
to worry about this, since both root objects NSObject and
NSProxy implement this method.
§Examples
Cast an NSString back and forth from NSObject.
use objc2::rc::Retained;
use objc2_foundation::{NSObject, NSString};
let obj: Retained<NSObject> = NSString::new().into_super();
let string = obj.downcast_ref::<NSString>().unwrap();
// Or with `downcast`, if we do not need the object afterwards
let string = obj.downcast::<NSString>().unwrap();Try (and fail) to cast an NSObject to an NSString.
use objc2_foundation::{NSObject, NSString};
let obj = NSObject::new();
assert!(obj.downcast_ref::<NSString>().is_none());Try to cast to an array of strings.
use objc2_foundation::{NSArray, NSObject, NSString};
let arr = NSArray::from_retained_slice(&[NSObject::new()]);
// This is invalid and doesn't type check.
let arr = arr.downcast_ref::<NSArray<NSString>>();This fails to compile, since it would require enumerating over the array to ensure that each element is of the desired type, which is a performance pitfall.
Downcast when processing each element instead.
use objc2_foundation::{NSArray, NSObject, NSString};
let arr = NSArray::from_retained_slice(&[NSObject::new()]);
for elem in arr {
if let Some(data) = elem.downcast_ref::<NSString>() {
// handle `data`
}
}Trait Implementations§
Source§impl AsRef<AnyObject> for CKSyncEngineState
impl AsRef<AnyObject> for CKSyncEngineState
Source§impl AsRef<CKSyncEngineState> for CKSyncEngineState
impl AsRef<CKSyncEngineState> for CKSyncEngineState
Source§impl AsRef<NSObject> for CKSyncEngineState
impl AsRef<NSObject> for CKSyncEngineState
Source§impl Borrow<AnyObject> for CKSyncEngineState
impl Borrow<AnyObject> for CKSyncEngineState
Source§impl Borrow<NSObject> for CKSyncEngineState
impl Borrow<NSObject> for CKSyncEngineState
Source§impl ClassType for CKSyncEngineState
impl ClassType for CKSyncEngineState
Source§const NAME: &'static str = "CKSyncEngineState"
const NAME: &'static str = "CKSyncEngineState"
Source§type ThreadKind = <<CKSyncEngineState as ClassType>::Super as ClassType>::ThreadKind
type ThreadKind = <<CKSyncEngineState as ClassType>::Super as ClassType>::ThreadKind
Source§impl Debug for CKSyncEngineState
impl Debug for CKSyncEngineState
Source§impl Deref for CKSyncEngineState
impl Deref for CKSyncEngineState
Source§impl Hash for CKSyncEngineState
impl Hash for CKSyncEngineState
Source§impl Message for CKSyncEngineState
impl Message for CKSyncEngineState
Source§impl NSObjectProtocol for CKSyncEngineState
impl NSObjectProtocol for CKSyncEngineState
Source§fn isEqual(&self, other: Option<&AnyObject>) -> bool
fn isEqual(&self, other: Option<&AnyObject>) -> bool
Source§fn hash(&self) -> usize
fn hash(&self) -> usize
Source§fn isKindOfClass(&self, cls: &AnyClass) -> bool
fn isKindOfClass(&self, cls: &AnyClass) -> bool
Source§fn is_kind_of<T>(&self) -> bool
fn is_kind_of<T>(&self) -> bool
isKindOfClass directly, or cast your objects with AnyObject::downcast_ref