我有一个基于核心数据的应用程序,它有一个对象(列表)到许多对象(列表项)关系.我正在设备之间同步数据,作为其中一部分,我从后台线程中的XML文件导入列表(通过NSOperation子类).
当我更新现有列表时,我删除了所有旧列表项(来自特定于该线程的NSManagedObjectContext)并将其替换为XML文件中的新列表...删除是通过枚举项目来处理的列表:
for (ListItemCD *item in listToUpdate.listItems) {
[self.importContext deleteObject:item];
}
Run Code Online (Sandbox Code Playgroud)
但是,有一段时间,我在枚举期间遇到了崩溃:
*由于未捕获的异常'NSGenericException'而终止应用程序,原因:'* Collection <_NSFaultingMutableSet:0x4fcfcb0>在枚举时发生了变异.
我不知道从哪里开始寻找问题的原因.在枚举发生时,我不会修改代码的任何其他部分中的列表.可以同时存在多个线程,因为导入/更新了不同的列表...将在另一个线程中保存上下文导致问题 - 因为它还通知主要上下文(如果它与枚举同时发生) ?
如果它有帮助,这里是来自我的NSOperation子类的"main"函数的代码(我从Core Data中删除旧的列表项,并通过解析XML数据来更新列表):
- (void)main {
// input the xml data into GDataXML
NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:self.filePath];
NSError *error;
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
// get the list name (so that I know which list to update)
NSString *listName;
NSArray *listNames = [doc.rootElement elementsForName:@"listName"];
if (listNames.count > 0) {
GDataXMLElement *listNameElement = (GDataXMLElement *) [listNames objectAtIndex:0];
listName …Run Code Online (Sandbox Code Playgroud) 有没有人知道是否NSFastEnumeration真的更快(如在运行时性能)比使用NSEnumerator或(对于数组)使用整数计数器并循环元素?
如果它确实更快,它如何达到这个速度?
或许"快速"实际上指的是编写迭代代码的速度更快?
提前致谢.
在使用快速枚举时,知道何时到达数组中的最后一个对象的最佳方法是什么?有没有比增加int然后将其与数组长度进行比较更好的方法?
我正在尝试理解如何为我正在创建的类采用快速枚举协议(在iOS /目标C下).我阅读了Apple的文档部分,但是......我不太明白!
有人可以查看一些示例代码吗?
我正在尝试做的事情:我有一个对象数组,我想让发送者迭代.发件人想要使用for-in构造.问题是我不希望发送者看到数组中的所有对象,因为其中一些对象在应用程序的上下文中无效.
换句话说,我希望我的迭代器返回符合特定条件的数组中的对象子集.
我不想在这个过程中创建任何新的数组,以免减慢速度.
一旦你得到你想要的东西,你将如何停止快速枚举.
在for循环中,我知道你只需将计数器数设置为千分之一.例:
for (int i=0;i<10;i++){
if (random requirement){
random code
i=1000;
}
}
Run Code Online (Sandbox Code Playgroud)
所以没有将快速枚举转换为正向循环类型的东西(通过比较我[array count]如何在过程中停止快速枚举?
在Objective-C中,是否可以重新启动到for循环的第一次迭代?在我找到一个"好"的对象之前,我不想对我的对象做任何事情,此时我想回去做每个对象的东西直到那个好对象.
所以,
bool someflag = false;
for (id object in array)
{
if(object is good)
{
someflag = true;
//restart to first object in loop
}
if(someflag)
{
doStuffWithObject(object);
}
}
Run Code Online (Sandbox Code Playgroud)
或者有不同的/更好的方式来做我想做的事情?
显然,简单的方法是只有两个独立的for循环 - 所以如果我能得到第二个意见告诉我这是最好的方式,那就是我要拍的东西.出于某种原因,我觉得必须有更好的方法.
我试图快速枚举我的所有集合视图单元格,但是下面的这个实现给了我一个警告.
for cell in self.collectionView?.visibleCells() as [UICollectionViewCell] {
// Do Stuff
}
Run Code Online (Sandbox Code Playgroud)
第一行显示以下错误:
postfix的操作数'?' 应该有可选的类型; type是'(UICollectionView,cellForItemAtIndexPath:NSIndexPath) - > UICollectionViewCell'
我已经尝试搞乱选项,并在Xcode 6 Beta 6中使用它,但在"Beta 7"中无济于事
我该如何摆脱这个错误?/写一个循环遍历我的所有CollectionView单元格?
fast-enumeration ios uicollectionview uicollectionviewcell swift
我可以删除我在Objective-C for循环中循环的项目而没有副作用吗?
例如,这样可以吗?
for (id item in items) {
if ( [item customCheck] ) {
[items removeObject:item]; // Is this ok here?
}
Run Code Online (Sandbox Code Playgroud) for-loop objective-c nsmutablearray nsarray fast-enumeration
我在这里有这个问题(以及关于SO的其他问题),以及有关Objective-C集合和快速枚举的Apple文档.不清楚的是,如果NSArray填充了不同类型,并创建了一个循环,如:
for ( NSString *string in myArray )
NSLog( @"%@\n", string );
Run Code Online (Sandbox Code Playgroud)
这到底发生了什么?循环会跳过任何不是的东西NSString吗?例如,如果(为了参数)a UIView在数组中,当循环遇到该项时会发生什么?
我找到了这个答案:
其中介绍了如何for in实现循环.
NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
for (NSUInteger i = 0; i < __count; i++) {
id obj = __objects[i];
[obj doSomething];
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我发现它错了.
首先,当您启用自动引用计数(ARC)时,您会收到错误消息
Sending '__strong id *' to parameter of type '__unsafe_unretained_id*' changes retain/release properties of pointer

但即使我关闭ARC,我发现__object数组似乎表现得很奇怪:

这是实际代码(我假设MAX_STACKBUFF_SIZE为40):
@autoreleasepool {
NSArray *myArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
int MAX_STACKBUFF_SIZE = 40;
NSFastEnumerationState __enumState = {0}; …Run Code Online (Sandbox Code Playgroud) fast-enumeration ×10
objective-c ×8
for-loop ×4
ios ×3
for-in-loop ×2
cocoa ×1
core-data ×1
foundation ×1
iphone ×1
iterator ×1
nsarray ×1
nsoperation ×1
performance ×1
swift ×1