Objective c 嵌套扫描效率

Objective c 嵌套扫描效率,objective-c,cocoa,parsing,performance,nsscanner,Objective C,Cocoa,Parsing,Performance,Nsscanner,运行嵌套的NSScanner是解析出一组重复元素的最有效方法,还是扫描可以一次完成 我有一个字符串,它是从一个命令行调用(NSTAsk)返回到苹果的压缩器(没有换行符,换行符完全是为了便于这个问题在不滚动的情况下清晰可见): 这里有个问题。在我的代码中,我扫描字符串,然后当我得到一个数据块时,扫描该数据块以创建一个填充数组的字典。这实际上意味着字符串将被遍历两次。由于这是每15-30秒左右发生一次的事情,可能包含数百个作业,因此我认为这是一个潜在的CPU和内存占用问题,而运行它的应用程序可能与压

运行嵌套的NSScanner是解析出一组重复元素的最有效方法,还是扫描可以一次完成

我有一个字符串,它是从一个命令行调用(
NSTAsk
)返回到苹果的压缩器(没有换行符,换行符完全是为了便于这个问题在不滚动的情况下清晰可见):

这里有个问题。在我的代码中,我扫描字符串,然后当我得到一个数据块时,扫描该数据块以创建一个填充数组的字典。这实际上意味着字符串将被遍历两次。由于这是每15-30秒左右发生一次的事情,可能包含数百个作业,因此我认为这是一个潜在的CPU和内存占用问题,而运行它的应用程序可能与压缩机应用程序(已经是一个内存和CPU占用问题)在同一台机器上——如果不需要的话,我不想增加任何负担

在我浏览NSScanner以获取数据时,是否有更好的方法使用它


任何建议或建议,不胜感激

您的嵌套是正确的,因为您正在使用jobScanner扫描的jobStatus构建detailScanner。这不是问题。不过你还有两个。其中一个原因是你对空白字符的使用太多,但更糟糕的是,你最外层的循环永远不会退出,因为你的初始if条件的形成方式

改变

if ([jobScanner scanUpToString:@"<jobstatus " intoString:NULL] &&
[jobScanner scanUpToCharactersFromSet:whitespace intoString:NULL] &&
[jobScanner scanUpToString:@" /jobstatus>" intoString:&jobStatus])
if([jobScanner ScanupString:@”“intoString:&jobStatus])

if([jobScanner扫描字符串:@“intoString:&jobStatus]&&
[jobScanner扫描字符串:@”/jobstatus>“intoString:NULL])
当然,您可以删除缓存空白字符集的行。您不需要扫描空白字符,也不需要将它们包含在您扫描或最多扫描到的字符串中。默认情况下,扫描仪跳过空白字符。取消对第一条NSLog语句的注释就证明了这一点;输出中的任何位置都没有任何多余的空格

但是,一旦扫描到一个给定的字符串,您就需要扫描该字符串本身,否则您将无法继续进行下一次迭代


除此之外,我认为你的方法是正确的。

trudyscosson-谢谢!这些变化正在进行,并且进展顺利。我是一个关注角色集的机器人,因为根据文档,这是一个昂贵的操作,但当然我错过了被跳过的空白部分,所以它变得毫无意义!再次感谢!
<jobstatus .... /jobstatus><jobstatus .... /jobstatus>
<jobstatus .... /jobstatus>
<jobstatus .... /jobstatus><batchstatus .... /batchstatus>
<jobstatus .... /jobstatus>
NSScanner * jobScanner = [NSScanner scannerWithString:dataAsString];
NSScanner * detailScanner = nil;

NSMutableDictionary * jobDictionary = [NSMutableDictionary dictionary];
NSMutableArray * jobsArray = [NSMutableArray array];

NSString * key = @"";
NSString * value = @"";

NSString * jobStatus = @"";

NSCharacterSet * whitespace = [NSCharacterSet whitespaceCharacterSet];

while ([jobScanner isAtEnd] == NO) {

    if ([jobScanner scanUpToString:@"<jobstatus " intoString:NULL] &&
        [jobScanner scanUpToCharactersFromSet:whitespace intoString:NULL] &&
        [jobScanner scanUpToString:@" /jobstatus>" intoString:&jobStatus]) {

        detailScanner = [NSScanner scannerWithString:jobStatus];

        [jobDictionary removeAllObjects];

        while ([detailScanner isAtEnd] == NO) {

            if ([detailScanner scanUpToString:@"=" intoString:&key] &&
                [detailScanner scanString:@"=\"" intoString:NULL] &&
                [detailScanner scanUpToString:@"\"" intoString:&value] &&
                [detailScanner scanString:@"\"" intoString:NULL]) {

                [jobDictionary setObject:value forKey:key];

                //NSLog(@"Key:(%@) Value:(%@)", key, value);
            }
        }

        [jobsArray addObject:
         [NSDictionary dictionaryWithDictionary:jobDictionary]];
    }

}

NSLog(@"Jobs Dictionary:%@", jobsArray);
Jobs Dictionary:(
    {
    batchid = "0C9041F5-A499-4D00-A26A-D7508EAF3F85";
    jobType = Compressor;
    jobid = "CD4046D8-CDC1-4F2D-B9A8-460DF6AF184E";
    name = "compressor.motn";
    percentComplete = 100;
    priority = HighPriority;
    resumePercentComplete = 100;
    sentBy = localuser;
    status = Successful;
    submissionTime = "12/4/10 3:56:16 PM";
    timeElapsed = "32 second(s)";
    timeElapsedSeconds = 32;
    timeRemaining = 0;
    timeRemainingSeconds = 0;
}
if ([jobScanner scanUpToString:@"<jobstatus " intoString:NULL] &&
[jobScanner scanUpToCharactersFromSet:whitespace intoString:NULL] &&
[jobScanner scanUpToString:@" /jobstatus>" intoString:&jobStatus])
if ([jobScanner scanString:@"<jobstatus" intoString:NULL] && 
[jobScanner scanUpToString:@"/jobstatus>" intoString:&jobStatus] && 
[jobScanner scanString:@"/jobstatus>" intoString:NULL])