for (ItemEntity *itemEntity in changedItemEntities) {
[[NetworkWrapper sharedInstance] uploadItemEntity:itemEntity userId:[itemEntity.userId unsignedIntegerValue] title:itemEntity.title completion:^(BOOL success, NSUInteger photoId, NSUInteger timeStamp) {
if (success) {
itemEntity.itemId = [NSNumber numberWithUnsignedInteger:photoId];
itemEntity.isUploaded = YES;
[self.context processPendingChanges];
NSError *error;
[self.context save:&error];
}
}];
}
这些代码行在简单的编程术语中做了什么?
答案 0 :(得分:3)
Objective-C的优势之一是其冗长的语法,使代码非常易读。
for (ItemEntity *itemEntity in changedItemEntities) {
这将在{}
中的每个for
对象的大括号(ItemEntity
)changedItemEntities
中执行操作。在大括号内,每个对象都可以称为itemEntity
。
[NetworkWrapper sharedInstance]
这将获得对名为NetworkWrapper
uploadItemEntity:itemEntity userId:[itemEntity.userId unsignedIntegerValue] title:itemEntity.title completion:
这告诉共享实例上传每个实体,其中包含从实体对象本身派生的用户ID和标题。有一个完成块,一旦操作完成就会运行,如下所示:
^(BOOL success, NSUInteger photoId, NSUInteger timeStamp) {
if (success) {
itemEntity.itemId = [NSNumber numberWithUnsignedInteger:photoId];
itemEntity.isUploaded = YES;
[self.context processPendingChanges];
NSError *error;
[self.context save:&error];
}
这将针对每个完成的上传运行。该代码将具有成功标志(布尔值),照片ID(整数)和时间戳(也是整数)。在您的示例中,值用于更新itemEntity
对象,然后context
行导致应用程序的Core Data存储将其数据保存到磁盘。
所以基本上你已经掌握了很多东西,你为每个人执行了一次上传操作,当每次上传完成后,你就会运行另一段代码。
答案 1 :(得分:1)
它遍历名为changedItemEntities
的集合,可能是NSArray
- 我们无法确定您是否显示定义,以及每个ItemEntity
在该集合中,它将uploadItemEntity:userId:title:completion:
选择器发送到NetworkWrapper
单例。单例是通过[NetworkWrapper sharedInstance]
访问的,这是Apple使用的标准Objective-C单例模式。它每次都会返回相同的指针,因此它可以移出循环并存储在本地。完成是在上传完成时要执行的块(lambda函数),大概是。推测单身人士传递上传操作的结果 - 表示成功或失败的布尔值,服务器生成的photoId,以及可能是上传操作的时间戳。然后该块将对此信息执行某些操作。在这种情况下,它似乎更新了实体并通过CoreData的东西提交了一些更改。
您可能希望单步执行此代码以更好地理解它。在第一行设置断点,并使用Xcode中的Step Over / Step Into按钮跟踪它。
如果您有具体问题,请提出新的具体问题。