@@ -13,19 +13,7 @@ class WriteFreelyModel: ObservableObject {
13
13
@Published var isLoggingIn : Bool = false
14
14
@Published var isProcessingRequest : Bool = false
15
15
@Published var hasNetworkConnection : Bool = true
16
- @Published var selectedPost : WFAPost ? {
17
- didSet {
18
- if let post = selectedPost {
19
- if post. status != PostStatus . published. rawValue {
20
- editor. setLastDraft ( post)
21
- } else {
22
- editor. clearLastDraft ( )
23
- }
24
- } else {
25
- editor. clearLastDraft ( )
26
- }
27
- }
28
- }
16
+ @Published var selectedPost : WFAPost ?
29
17
@Published var isPresentingDeleteAlert : Bool = false
30
18
@Published var isPresentingLoginErrorAlert : Bool = false
31
19
@Published var isPresentingNetworkErrorAlert : Bool = false
@@ -347,44 +335,49 @@ private extension WriteFreelyModel {
347
335
DispatchQueue . main. async {
348
336
self . isProcessingRequest = false
349
337
}
338
+ let request = WFAPost . createFetchRequest ( )
350
339
do {
351
- var postsToDelete = posts. userPosts. filter { $0. status != PostStatus . local. rawValue }
352
- let fetchedPosts = try result. get ( )
353
- for fetchedPost in fetchedPosts {
354
- if let managedPost = posts. userPosts. first ( where: { $0. postId == fetchedPost. postId } ) {
355
- managedPost. wasDeletedFromServer = false
356
- if let fetchedPostUpdatedDate = fetchedPost. updatedDate,
357
- let localPostUpdatedDate = managedPost. updatedDate {
358
- managedPost. hasNewerRemoteCopy = fetchedPostUpdatedDate > localPostUpdatedDate
340
+ let locallyCachedPosts = try LocalStorageManager . persistentContainer. viewContext. fetch ( request)
341
+ do {
342
+ var postsToDelete = locallyCachedPosts. filter { $0. status != PostStatus . local. rawValue }
343
+ let fetchedPosts = try result. get ( )
344
+ for fetchedPost in fetchedPosts {
345
+ if let managedPost = locallyCachedPosts. first ( where: { $0. postId == fetchedPost. postId } ) {
346
+ DispatchQueue . main. async {
347
+ managedPost. wasDeletedFromServer = false
348
+ if let fetchedPostUpdatedDate = fetchedPost. updatedDate,
349
+ let localPostUpdatedDate = managedPost. updatedDate {
350
+ managedPost. hasNewerRemoteCopy = fetchedPostUpdatedDate > localPostUpdatedDate
351
+ } else { print ( " Error: could not determine which copy of post is newer " ) }
352
+ postsToDelete. removeAll ( where: { $0. postId == fetchedPost. postId } )
353
+ }
359
354
} else {
360
- print ( " Error: could not determine which copy of post is newer " )
355
+ DispatchQueue . main. async {
356
+ let managedPost = WFAPost ( context: LocalStorageManager . persistentContainer. viewContext)
357
+ managedPost. postId = fetchedPost. postId
358
+ managedPost. slug = fetchedPost. slug
359
+ managedPost. appearance = fetchedPost. appearance
360
+ managedPost. language = fetchedPost. language
361
+ managedPost. rtl = fetchedPost. rtl ?? false
362
+ managedPost. createdDate = fetchedPost. createdDate
363
+ managedPost. updatedDate = fetchedPost. updatedDate
364
+ managedPost. title = fetchedPost. title ?? " "
365
+ managedPost. body = fetchedPost. body
366
+ managedPost. collectionAlias = fetchedPost. collectionAlias
367
+ managedPost. status = PostStatus . published. rawValue
368
+ managedPost. wasDeletedFromServer = false
369
+ }
361
370
}
362
- postsToDelete. removeAll ( where: { $0. postId == fetchedPost. postId } )
363
- } else {
364
- let managedPost = WFAPost ( context: LocalStorageManager . persistentContainer. viewContext)
365
- managedPost. postId = fetchedPost. postId
366
- managedPost. slug = fetchedPost. slug
367
- managedPost. appearance = fetchedPost. appearance
368
- managedPost. language = fetchedPost. language
369
- managedPost. rtl = fetchedPost. rtl ?? false
370
- managedPost. createdDate = fetchedPost. createdDate
371
- managedPost. updatedDate = fetchedPost. updatedDate
372
- managedPost. title = fetchedPost. title ?? " "
373
- managedPost. body = fetchedPost. body
374
- managedPost. collectionAlias = fetchedPost. collectionAlias
375
- managedPost. status = PostStatus . published. rawValue
376
- managedPost. wasDeletedFromServer = false
377
371
}
378
- }
379
- for post in postsToDelete {
380
- post. wasDeletedFromServer = true
381
- }
382
- DispatchQueue . main. async {
383
- LocalStorageManager ( ) . saveContext ( )
384
- self . posts. loadCachedPosts ( )
372
+ DispatchQueue . main. async {
373
+ for post in postsToDelete { post. wasDeletedFromServer = true }
374
+ LocalStorageManager ( ) . saveContext ( )
375
+ }
376
+ } catch {
377
+ print ( error)
385
378
}
386
379
} catch {
387
- print ( error )
380
+ print ( " Error: Failed to fetch cached posts " )
388
381
}
389
382
}
390
383
@@ -399,23 +392,37 @@ private extension WriteFreelyModel {
399
392
// See: https://github.com/writeas/writefreely-swift/issues/20
400
393
do {
401
394
let fetchedPost = try result. get ( )
402
- let foundPostIndex = posts. userPosts. firstIndex ( where: {
403
- $0. title == fetchedPost. title && $0. body == fetchedPost. body
404
- } )
405
- guard let index = foundPostIndex else { return }
406
- let cachedPost = self . posts. userPosts [ index]
407
- cachedPost. appearance = fetchedPost. appearance
408
- cachedPost. body = fetchedPost. body
409
- cachedPost. createdDate = fetchedPost. createdDate
410
- cachedPost. language = fetchedPost. language
411
- cachedPost. postId = fetchedPost. postId
412
- cachedPost. rtl = fetchedPost. rtl ?? false
413
- cachedPost. slug = fetchedPost. slug
414
- cachedPost. status = PostStatus . published. rawValue
415
- cachedPost. title = fetchedPost. title ?? " "
416
- cachedPost. updatedDate = fetchedPost. updatedDate
417
- DispatchQueue . main. async {
418
- LocalStorageManager ( ) . saveContext ( )
395
+ let request = WFAPost . createFetchRequest ( )
396
+ let matchBodyPredicate = NSPredicate ( format: " body == %@ " , fetchedPost. body)
397
+ if let fetchedPostTitle = fetchedPost. title {
398
+ let matchTitlePredicate = NSPredicate ( format: " title == %@ " , fetchedPostTitle)
399
+ request. predicate = NSCompoundPredicate (
400
+ andPredicateWithSubpredicates: [
401
+ matchTitlePredicate,
402
+ matchBodyPredicate
403
+ ]
404
+ )
405
+ } else {
406
+ request. predicate = matchBodyPredicate
407
+ }
408
+ do {
409
+ let cachedPostsResults = try LocalStorageManager . persistentContainer. viewContext. fetch ( request)
410
+ guard let cachedPost = cachedPostsResults. first else { return }
411
+ cachedPost. appearance = fetchedPost. appearance
412
+ cachedPost. body = fetchedPost. body
413
+ cachedPost. createdDate = fetchedPost. createdDate
414
+ cachedPost. language = fetchedPost. language
415
+ cachedPost. postId = fetchedPost. postId
416
+ cachedPost. rtl = fetchedPost. rtl ?? false
417
+ cachedPost. slug = fetchedPost. slug
418
+ cachedPost. status = PostStatus . published. rawValue
419
+ cachedPost. title = fetchedPost. title ?? " "
420
+ cachedPost. updatedDate = fetchedPost. updatedDate
421
+ DispatchQueue . main. async {
422
+ LocalStorageManager ( ) . saveContext ( )
423
+ }
424
+ } catch {
425
+ print ( " Error: Failed to fetch cached posts " )
419
426
}
420
427
} catch {
421
428
print ( error)
@@ -447,7 +454,6 @@ private extension WriteFreelyModel {
447
454
cachedPost. hasNewerRemoteCopy = false
448
455
DispatchQueue . main. async {
449
456
LocalStorageManager ( ) . saveContext ( )
450
- self . posts. loadCachedPosts ( )
451
457
}
452
458
} catch {
453
459
print ( error)
0 commit comments