Clean up ahead of PR.

pull/1/head
Matthew Chen 7 years ago
parent 54eecd5b1d
commit 62da17a0cc

@ -35,8 +35,8 @@ import CloudKit
@objc @objc
public class func saveTestFileToCloud(fileUrl: URL, public class func saveTestFileToCloud(fileUrl: URL,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
saveFileToCloud(fileUrl: fileUrl, saveFileToCloud(fileUrl: fileUrl,
recordName: NSUUID().uuidString, recordName: NSUUID().uuidString,
recordType: signalBackupRecordType, recordType: signalBackupRecordType,
@ -50,8 +50,8 @@ import CloudKit
// complete. // complete.
@objc @objc
public class func saveEphemeralDatabaseFileToCloud(fileUrl: URL, public class func saveEphemeralDatabaseFileToCloud(fileUrl: URL,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
saveFileToCloud(fileUrl: fileUrl, saveFileToCloud(fileUrl: fileUrl,
recordName: "ephemeralFile-\(NSUUID().uuidString)", recordName: "ephemeralFile-\(NSUUID().uuidString)",
recordType: signalBackupRecordType, recordType: signalBackupRecordType,
@ -64,9 +64,9 @@ import CloudKit
// backups can reuse the same record. // backups can reuse the same record.
@objc @objc
public class func savePersistentFileOnceToCloud(fileId: String, public class func savePersistentFileOnceToCloud(fileId: String,
fileUrlBlock: @escaping (Swift.Void) -> URL?, fileUrlBlock: @escaping (()) -> URL?,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
saveFileOnceToCloud(recordName: "persistentFile-\(fileId)", saveFileOnceToCloud(recordName: "persistentFile-\(fileId)",
recordType: signalBackupRecordType, recordType: signalBackupRecordType,
fileUrlBlock: fileUrlBlock, fileUrlBlock: fileUrlBlock,
@ -76,8 +76,8 @@ import CloudKit
@objc @objc
public class func upsertManifestFileToCloud(fileUrl: URL, public class func upsertManifestFileToCloud(fileUrl: URL,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
// We want to use a well-known record id and type for manifest files. // We want to use a well-known record id and type for manifest files.
upsertFileToCloud(fileUrl: fileUrl, upsertFileToCloud(fileUrl: fileUrl,
recordName: manifestRecordName, recordName: manifestRecordName,
@ -90,8 +90,8 @@ import CloudKit
public class func saveFileToCloud(fileUrl: URL, public class func saveFileToCloud(fileUrl: URL,
recordName: String, recordName: String,
recordType: String, recordType: String,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
let recordID = CKRecordID(recordName: recordName) let recordID = CKRecordID(recordName: recordName)
let record = CKRecord(recordType: recordType, recordID: recordID) let record = CKRecord(recordType: recordType, recordID: recordID)
let asset = CKAsset(fileURL: fileUrl) let asset = CKAsset(fileURL: fileUrl)
@ -104,8 +104,8 @@ import CloudKit
@objc @objc
public class func saveRecordToCloud(record: CKRecord, public class func saveRecordToCloud(record: CKRecord,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
saveRecordToCloud(record: record, saveRecordToCloud(record: record,
remainingRetries: maxRetries, remainingRetries: maxRetries,
success: success, success: success,
@ -114,21 +114,21 @@ import CloudKit
private class func saveRecordToCloud(record: CKRecord, private class func saveRecordToCloud(record: CKRecord,
remainingRetries: Int, remainingRetries: Int,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
database().save(record) { database().save(record) {
(_, error) in (_, error) in
let response = responseForCloudKitError(error: error, let outcome = outcomeForCloudKitError(error: error,
remainingRetries: remainingRetries, remainingRetries: remainingRetries,
label: "Save Record") label: "Save Record")
switch response { switch outcome {
case .success: case .success:
let recordName = record.recordID.recordName let recordName = record.recordID.recordName
success(recordName) success(recordName)
case .failureDoNotRetry(let responseError): case .failureDoNotRetry(let outcomeError):
failure(responseError) failure(outcomeError)
case .failureRetryAfterDelay(let retryDelay): case .failureRetryAfterDelay(let retryDelay):
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: { DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: {
saveRecordToCloud(record: record, saveRecordToCloud(record: record,
@ -159,8 +159,8 @@ import CloudKit
public class func upsertFileToCloud(fileUrl: URL, public class func upsertFileToCloud(fileUrl: URL,
recordName: String, recordName: String,
recordType: String, recordType: String,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
checkForFileInCloud(recordName: recordName, checkForFileInCloud(recordName: recordName,
remainingRetries: maxRetries, remainingRetries: maxRetries,
@ -192,9 +192,9 @@ import CloudKit
@objc @objc
public class func saveFileOnceToCloud(recordName: String, public class func saveFileOnceToCloud(recordName: String,
recordType: String, recordType: String,
fileUrlBlock: @escaping (Swift.Void) -> URL?, fileUrlBlock: @escaping (()) -> URL?,
success: @escaping (String) -> Swift.Void, success: @escaping (String) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
checkForFileInCloud(recordName: recordName, checkForFileInCloud(recordName: recordName,
remainingRetries: maxRetries, remainingRetries: maxRetries,
@ -226,8 +226,8 @@ import CloudKit
@objc @objc
public class func deleteRecordFromCloud(recordName: String, public class func deleteRecordFromCloud(recordName: String,
success: @escaping (Swift.Void) -> Swift.Void, success: @escaping (()) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
deleteRecordFromCloud(recordName: recordName, deleteRecordFromCloud(recordName: recordName,
remainingRetries: maxRetries, remainingRetries: maxRetries,
success: success, success: success,
@ -236,22 +236,22 @@ import CloudKit
private class func deleteRecordFromCloud(recordName: String, private class func deleteRecordFromCloud(recordName: String,
remainingRetries: Int, remainingRetries: Int,
success: @escaping (Swift.Void) -> Swift.Void, success: @escaping (()) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
let recordID = CKRecordID(recordName: recordName) let recordID = CKRecordID(recordName: recordName)
database().delete(withRecordID: recordID) { database().delete(withRecordID: recordID) {
(_, error) in (_, error) in
let response = responseForCloudKitError(error: error, let outcome = outcomeForCloudKitError(error: error,
remainingRetries: remainingRetries, remainingRetries: remainingRetries,
label: "Delete Record") label: "Delete Record")
switch response { switch outcome {
case .success: case .success:
success() success()
case .failureDoNotRetry(let responseError): case .failureDoNotRetry(let outcomeError):
failure(responseError) failure(outcomeError)
case .failureRetryAfterDelay(let retryDelay): case .failureRetryAfterDelay(let retryDelay):
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: { DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: {
deleteRecordFromCloud(recordName: recordName, deleteRecordFromCloud(recordName: recordName,
@ -277,8 +277,8 @@ import CloudKit
private class func checkForFileInCloud(recordName: String, private class func checkForFileInCloud(recordName: String,
remainingRetries: Int, remainingRetries: Int,
success: @escaping (CKRecord?) -> Swift.Void, success: @escaping (CKRecord?) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
let recordId = CKRecordID(recordName: recordName) let recordId = CKRecordID(recordName: recordName)
let fetchOperation = CKFetchRecordsOperation(recordIDs: [recordId ]) let fetchOperation = CKFetchRecordsOperation(recordIDs: [recordId ])
// Don't download the file; we're just using the fetch to check whether or // Don't download the file; we're just using the fetch to check whether or
@ -286,10 +286,10 @@ import CloudKit
fetchOperation.desiredKeys = [] fetchOperation.desiredKeys = []
fetchOperation.perRecordCompletionBlock = { (record, recordId, error) in fetchOperation.perRecordCompletionBlock = { (record, recordId, error) in
let response = responseForCloudKitError(error: error, let outcome = outcomeForCloudKitError(error: error,
remainingRetries: remainingRetries, remainingRetries: remainingRetries,
label: "Check for Record") label: "Check for Record")
switch response { switch outcome {
case .success: case .success:
guard let record = record else { guard let record = record else {
owsFail("\(self.logTag) missing fetching record.") owsFail("\(self.logTag) missing fetching record.")
@ -298,8 +298,8 @@ import CloudKit
} }
// Record found. // Record found.
success(record) success(record)
case .failureDoNotRetry(let responseError): case .failureDoNotRetry(let outcomeError):
failure(responseError) failure(outcomeError)
case .failureRetryAfterDelay(let retryDelay): case .failureRetryAfterDelay(let retryDelay):
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: { DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: {
checkForFileInCloud(recordName: recordName, checkForFileInCloud(recordName: recordName,
@ -323,8 +323,8 @@ import CloudKit
} }
@objc @objc
public class func checkForManifestInCloud(success: @escaping (Bool) -> Swift.Void, public class func checkForManifestInCloud(success: @escaping (Bool) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
checkForFileInCloud(recordName: manifestRecordName, checkForFileInCloud(recordName: manifestRecordName,
remainingRetries: maxRetries, remainingRetries: maxRetries,
@ -335,8 +335,8 @@ import CloudKit
} }
@objc @objc
public class func fetchAllRecordNames(success: @escaping ([String]) -> Swift.Void, public class func fetchAllRecordNames(success: @escaping ([String]) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
let query = CKQuery(recordType: signalBackupRecordType, predicate: NSPredicate(value: true)) let query = CKQuery(recordType: signalBackupRecordType, predicate: NSPredicate(value: true))
// Fetch the first page of results for this query. // Fetch the first page of results for this query.
@ -352,8 +352,8 @@ import CloudKit
previousRecordNames: [String], previousRecordNames: [String],
cursor: CKQueryCursor?, cursor: CKQueryCursor?,
remainingRetries: Int, remainingRetries: Int,
success: @escaping ([String]) -> Swift.Void, success: @escaping ([String]) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
var allRecordNames = previousRecordNames var allRecordNames = previousRecordNames
@ -369,10 +369,10 @@ import CloudKit
} }
queryOperation.queryCompletionBlock = { (cursor, error) in queryOperation.queryCompletionBlock = { (cursor, error) in
let response = responseForCloudKitError(error: error, let outcome = outcomeForCloudKitError(error: error,
remainingRetries: remainingRetries, remainingRetries: remainingRetries,
label: "Fetch All Records") label: "Fetch All Records")
switch response { switch outcome {
case .success: case .success:
if let cursor = cursor { if let cursor = cursor {
Logger.verbose("\(self.logTag) fetching more record names \(allRecordNames.count).") Logger.verbose("\(self.logTag) fetching more record names \(allRecordNames.count).")
@ -387,8 +387,8 @@ import CloudKit
} }
Logger.info("\(self.logTag) fetched \(allRecordNames.count) record names.") Logger.info("\(self.logTag) fetched \(allRecordNames.count) record names.")
success(allRecordNames) success(allRecordNames)
case .failureDoNotRetry(let responseError): case .failureDoNotRetry(let outcomeError):
failure(responseError) failure(outcomeError)
case .failureRetryAfterDelay(let retryDelay): case .failureRetryAfterDelay(let retryDelay):
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: { DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: {
fetchAllRecordNamesStep(query: query, fetchAllRecordNamesStep(query: query,
@ -419,8 +419,8 @@ import CloudKit
@objc @objc
public class func downloadManifestFromCloud( public class func downloadManifestFromCloud(
success: @escaping (Data) -> Swift.Void, success: @escaping (Data) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
downloadDataFromCloud(recordName: manifestRecordName, downloadDataFromCloud(recordName: manifestRecordName,
success: success, success: success,
failure: failure) failure: failure)
@ -428,8 +428,8 @@ import CloudKit
@objc @objc
public class func downloadDataFromCloud(recordName: String, public class func downloadDataFromCloud(recordName: String,
success: @escaping (Data) -> Swift.Void, success: @escaping (Data) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
downloadFromCloud(recordName: recordName, downloadFromCloud(recordName: recordName,
remainingRetries: maxRetries, remainingRetries: maxRetries,
@ -450,8 +450,8 @@ import CloudKit
@objc @objc
public class func downloadFileFromCloud(recordName: String, public class func downloadFileFromCloud(recordName: String,
toFileUrl: URL, toFileUrl: URL,
success: @escaping (Swift.Void) -> Swift.Void, success: @escaping (()) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
downloadFromCloud(recordName: recordName, downloadFromCloud(recordName: recordName,
remainingRetries: maxRetries, remainingRetries: maxRetries,
@ -476,18 +476,18 @@ import CloudKit
// the asset. // the asset.
private class func downloadFromCloud(recordName: String, private class func downloadFromCloud(recordName: String,
remainingRetries: Int, remainingRetries: Int,
success: @escaping (CKAsset) -> Swift.Void, success: @escaping (CKAsset) -> Void,
failure: @escaping (Error) -> Swift.Void) { failure: @escaping (Error) -> Void) {
let recordId = CKRecordID(recordName: recordName) let recordId = CKRecordID(recordName: recordName)
let fetchOperation = CKFetchRecordsOperation(recordIDs: [recordId ]) let fetchOperation = CKFetchRecordsOperation(recordIDs: [recordId ])
// Download all keys for this record. // Download all keys for this record.
fetchOperation.perRecordCompletionBlock = { (record, recordId, error) in fetchOperation.perRecordCompletionBlock = { (record, recordId, error) in
let response = responseForCloudKitError(error: error, let outcome = outcomeForCloudKitError(error: error,
remainingRetries: remainingRetries, remainingRetries: remainingRetries,
label: "Download Record") label: "Download Record")
switch response { switch outcome {
case .success: case .success:
guard let record = record else { guard let record = record else {
Logger.error("\(self.logTag) missing fetching record.") Logger.error("\(self.logTag) missing fetching record.")
@ -500,8 +500,8 @@ import CloudKit
return return
} }
success(asset) success(asset)
case .failureDoNotRetry(let responseError): case .failureDoNotRetry(let outcomeError):
failure(responseError) failure(outcomeError)
case .failureRetryAfterDelay(let retryDelay): case .failureRetryAfterDelay(let retryDelay):
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: { DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + retryDelay, execute: {
downloadFromCloud(recordName: recordName, downloadFromCloud(recordName: recordName,
@ -527,7 +527,7 @@ import CloudKit
// MARK: - Access // MARK: - Access
@objc @objc
public class func checkCloudKitAccess(completion: @escaping (Bool) -> Swift.Void) { public class func checkCloudKitAccess(completion: @escaping (Bool) -> Void) {
CKContainer.default().accountStatus(completionHandler: { (accountStatus, error) in CKContainer.default().accountStatus(completionHandler: { (accountStatus, error) in
DispatchQueue.main.async { DispatchQueue.main.async {
switch accountStatus { switch accountStatus {
@ -552,7 +552,7 @@ import CloudKit
// MARK: - Retry // MARK: - Retry
private enum CKErrorResponse { private enum CKOutcome {
case success case success
case failureDoNotRetry(error:Error) case failureDoNotRetry(error:Error)
case failureRetryAfterDelay(retryDelay: Double) case failureRetryAfterDelay(retryDelay: Double)
@ -561,9 +561,9 @@ import CloudKit
case unknownItem case unknownItem
} }
private class func responseForCloudKitError(error: Error?, private class func outcomeForCloudKitError(error: Error?,
remainingRetries: Int, remainingRetries: Int,
label: String) -> CKErrorResponse { label: String) -> CKOutcome {
if let error = error as? CKError { if let error = error as? CKError {
if error.code == CKError.unknownItem { if error.code == CKError.unknownItem {
// This is not always an error for our purposes. // This is not always an error for our purposes.

Loading…
Cancel
Save