ios - 其值在 block 内赋值的引用变量

标签 ios swift scope closures block

您好,对于分配给完成 block 内的外部 ref 变量的值的范围是什么感到困惑。例如,在下面的代码中,操作错误和保存记录的值将在完成 block 之外保留。

    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 循环内。

最佳答案

您的假设是正确的,在执行完成处理程序后,这些在封装范围内定义的变量将被修改。所以您的代码应该按预期工作。

您还可以使用以下内容:

ckModifyRecordsOperation.main()

而不是:

self.operationQueue?.addOperation(ckModifyRecordsOperation)
self.operationQueue?.waitUntilAllOperationsAreFinished()

希望有帮助。

关于ios - 其值在 block 内赋值的引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37538300/

相关文章:

iphone - 适用于iPhone的PDF417条形码api

swift - UITableView 自定义单元格高度无法正确管理 swift 中的动态约束

ios - 无法将类型 'SPTSession' (0x110afab98) 的值转换为 'SPTSession' (0x10f17f638)

azure - 如何在 Azure Application Insights 中使用 BeginScope(在 https ://portal. azure.com 中)?

sql-server - 这是存储过程中写得好的事务吗

Ios 在 Swift 2.2 中为 NSManagedObject 子类创建自定义初始化

ios - 合并多个音频文件以在iOS上实时播放

javascript - 为什么我的指令不能从其父作用域继承函数?

javascript - IOS Chrome 选择框宽度问题

ios - 如何捕获自动布局约束冗余