public static CKFetchRecordChangesOperation GetOperation (CKRecordZoneID recordZoneID, CKServerChangeToken previousServerChangeToken) { IntPtr classPtr = Class.GetHandle ("CKFetchRecordChangesOperation"); IntPtr allocSel = Selector.GetHandle ("alloc"); IntPtr objPtr = IntPtr_objc_msgSend (classPtr, allocSel); IntPtr ret = IntPtr_objc_msgSend_IntPtr_IntPtr (objPtr, Selector.GetHandle ("initWithRecordZoneID:previousServerChangeToken:"), recordZoneID.Handle, previousServerChangeToken == null ? IntPtr.Zero : previousServerChangeToken.Handle); return Runtime.GetNSObject<CKFetchRecordChangesOperation> (ret); }
public void Reset () { ChangeToken = null; Results.Reset (); recordsByID.Clear (); }
public void Reset() { ChangeToken = null; Results.Reset(); recordsByID.Clear(); }
public static CKFetchRecordChangesOperation GetOperation(CKRecordZoneID recordZoneID, CKServerChangeToken previousServerChangeToken) { IntPtr classPtr = Class.GetHandle("CKFetchRecordChangesOperation"); IntPtr allocSel = Selector.GetHandle("alloc"); IntPtr objPtr = IntPtr_objc_msgSend(classPtr, allocSel); IntPtr ret = IntPtr_objc_msgSend_IntPtr_IntPtr(objPtr, Selector.GetHandle("initWithRecordZoneID:previousServerChangeToken:"), recordZoneID.Handle, previousServerChangeToken == null ? IntPtr.Zero : previousServerChangeToken.Handle); return(Runtime.GetNSObject <CKFetchRecordChangesOperation> (ret)); }
public override Task <Results> Run() { string zoneName; bool shouldCache; if (!TryGetString("zoneName", out zoneName) || !TryGetBool("cache", out shouldCache)) { throw new InvalidProgramException(); } var zoneId = new CKRecordZoneID(zoneName, CKContainer.OwnerDefaultName); ChangedRecords cache; if (!recordCache.TryGetValue(zoneId, out cache)) { recordCache [zoneId] = cache = new ChangedRecords(); } cache.RemoveChanges(); if (!cache.Results.MoreComing && !shouldCache) { cache.Reset(); } CKServerChangeToken changeToken = null; var token = cache.ChangeToken; if (token != null && (shouldCache || cache.Results.MoreComing)) { changeToken = token; } // TODO: https://bugzilla.xamarin.com/show_bug.cgi?id=42163 //var operation = new CKFetchRecordChangesOperation (zoneId, changeToken); var operation = CKFetchRecordChangesOperationFactory.GetOperation(zoneId, changeToken); operation.DesiredKeys = new string [] { "name", "location" }; operation.ResultsLimit = 2; operation.RecordChanged = (record) => { CKRecord cachedRecord = cache.GetRecordById(record.Id); if (cachedRecord != null) { foreach (var key in record.AllKeys()) { cachedRecord [key] = record [key]; } cache.MarkRecordAsModified(cachedRecord); } else { cache.AddRecord(record); } }; operation.RecordDeleted = cache.MarkRecordAsDeleted; var tcs = new TaskCompletionSource <Results> (); operation.AllChangesReported = (chToken, nsData, nsError) => { if (nsError == null) { cache.ChangeToken = chToken; cache.SetMoreComing(operation.MoreComing); } tcs.SetResult(cache.GetRecords()); }; operation.Start(); return(tcs.Task); }