안녕하세요, 완료 블록 내에서 외부 참조 변수에 할당 된 값의 범위가 혼동스러워합니다. 예를 들어 아래 코드에서 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를 할당해야합니다.
왜 차단하고 대기 중입니까? 완료 블록에서 다른 함수를 호출하는 것이 어떻습니까? – Wain
귀하의 가정은 정확합니다. 인클로저 범위에서 무시 된 이러한 변수는 완료 핸들러가 수행 된 후에 수정됩니다. 따라서 코드는 예상대로 작동해야합니다. –
하나의 관찰 - self.operationQueue는 메소드 호출 전에 설정되어야합니다. 큐를 설정하지 않은 경우 코드를 추가하고 throw하는 것이 좋습니다. –