補完ブロック内の外部参照変数に割り当てられている値の範囲が混乱しています。たとえば、以下のコードでは、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を設定する必要があります。キューが設定されていない場合は、コードをチェックインしてスローすることをお勧めします。 –