首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >其值在块内赋值的引用变量

其值在块内赋值的引用变量
EN

Stack Overflow用户
提问于 2016-05-31 14:26:20
回答 1查看 110关注 0票数 0

Hi对赋值给完成块内的外部ref变量的范围有一个困惑。例如,在下面的代码中,operationError和savedRecords的值将在完成块之外持久化。

代码语言:javascript
复制
    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
        }

}

注意:由于函数applyLocalChangesToServer抛出错误并且在while循环中,因此我分配了operationError。

EN

回答 1

Stack Overflow用户

发布于 2016-05-31 14:47:57

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

您还可以使用以下命令:

代码语言:javascript
复制
ckModifyRecordsOperation.main()

而不是:

代码语言:javascript
复制
self.operationQueue?.addOperation(ckModifyRecordsOperation)
self.operationQueue?.waitUntilAllOperationsAreFinished()

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37538300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档