【发布时间】:2016-05-31 06:26:20
【问题描述】:
您对分配给完成块内的外部 ref 变量的值的范围感到困惑。例如,在下面的代码中, operationError 和 savedRecords 的值将在完成块之外持续存在。
func applyLocalChangesToServer(insertedOrUpdatedCKRecords:Array<CKRecord>,deletedCKRecordIDs:Array<CKRecordID>) throws
{
var savedRecords:[CKRecord]?
var conflictedRecords:[CKRecord] = [CKRecord]()
var removeRecords:[CKRecord] = [CKRecord]()
var operationError : NSError?
let ckModifyRecordsOperation = CKModifyRecordsOperation(recordsToSave:insertedOrUpdatedCKRecords, recordIDsToDelete: deletedCKRecordIDs);
ckModifyRecordsOperation.atomic = true
ckModifyRecordsOperation.modifyRecordsCompletionBlock = ({(savedRecords1,deletedRecordIDs1,error)->Void in
operationError = error
if error == nil
{
wasSuccessful = true
savedRecords = savedRecords1
}
else
{
wasSuccessful = false
savedRecords = nil
errorCKS = self.handleError(error!)
}
})
ckModifyRecordsOperation.perRecordCompletionBlock = ({(ckRecord,error)->Void in
if error != nil
{
if error!.code == CKErrorCode.ServerRecordChanged.rawValue
{
conflictedRecords.append(ckRecord!)
}
}
})
self.operationQueue?.addOperation(ckModifyRecordsOperation)
self.operationQueue?.waitUntilAllOperationsAreFinished()
if conflictedRecords.count > 0
{
//Do work here
}
else if operationError != nil //Other then the partial error
{
throw operationError
}
}
注意:由于 func applyLocalChangesToServer 抛出错误并且在 while 循环内,因此分配了 operationError。
【问题讨论】:
-
你为什么要阻止和等待?为什么不从完成块中调用另一个函数?
-
你的假设是正确的,这些在外壳范围内定义的变量将在完成处理程序执行后被修改。所以你的代码应该能按预期工作。
-
一个观察 - self.operationQueue 必须在方法调用之前设置。如果未设置队列,我建议在代码中添加检查并抛出。
-
@wain 我需要反复调用这个函数,直到所有冲突都解决,所以我必须递归调用这个函数或者在 while 循环中使用。
-
@ignor B. 所以它们的值将一直持续到 applyLocalChangesToServer 函数的范围。 Okaies 将添加支票。
标签: ios swift scope closures block