使用block语句检测失败的文件修改

时间:2014-08-13 03:35:19

标签: ios objective-c objective-c-blocks

我有一个tableview的视图控制器,每个tableview单元格中都有一个可编辑的UILabel。每个单元格还与音频文件相关联。每当编辑标签时,我都会调用一个NSObject子类来处理我的文件,将音频文件重命名为标签被更改为的内容。然后我返回NSURL绝对字符串以存储在核心数据中。我的问题是,如果此过程抛出错误 - 例如“文件路径已存在”,我怎样才能让它在我的视图控制器中显示UIAlertView而不是我的NSObject子类。我猜我需要某种类型的块来返回NSStringNSError。我对块没有太多经验,我们将不胜感激。

我的视图控制器中调用NSObject子类重命名文件的方法

recording.audioURL = [self.managedDocument changeFileName:previousPath withNewComponent:textField.text];

这是我的NSObject子类中重命名音频文件

的方法
-(NSString*) changeFileName:(NSString*) previousPath withNewComponent:(NSString*)newComponenet
{  
    NSURL * oldURL = [self.url URLByAppendingPathComponent:@"audioFiles"];
    oldURL = [oldURL URLByAppendingPathComponent:[previousPath lastPathComponent]];

     NSString * trimmedString = [newComponenet stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSURL * newURL = [self.url URLByAppendingPathComponent:@"audioFiles"];
    newURL = [newURL URLByAppendingPathComponent:trimmedString];
    newURL = [newURL URLByAppendingPathExtension:@"m4a"];

    NSFileManager * fileManager = [NSFileManager defaultManager];
    NSError * err;

    BOOL result = [fileManager moveItemAtURL:oldURL toURL:newURL error:&err];

    if(!result)
    {
        NSLog(@"Error: %@", err);
    }

    return newURL.absoluteString;
}

1 个答案:

答案 0 :(得分:1)

最直接的方法是遵循您正在使用的NSFileManager方法的示例。通过by-reference参数间接输出NSError*指针,并使方法的直接返回值表示成功或失败:

-(NSString*) changeFileName:(NSString*) previousPath withNewComponent:(NSString*)newComponenet error:(NSError**)error
{  
    NSURL * oldURL = [self.url URLByAppendingPathComponent:@"audioFiles"];
    oldURL = [oldURL URLByAppendingPathComponent:[previousPath lastPathComponent]];

     NSString * trimmedString = [newComponenet stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSURL * newURL = [self.url URLByAppendingPathComponent:@"audioFiles"];
    newURL = [newURL URLByAppendingPathComponent:trimmedString];
    newURL = [newURL URLByAppendingPathExtension:@"m4a"];

    NSFileManager * fileManager = [NSFileManager defaultManager];

    BOOL result = [fileManager moveItemAtURL:oldURL toURL:newURL error:error];

    if(!result)
        return nil;

    return newURL.absoluteString;
}

在调用者中,检查返回值以确定它是否失败,如果是,则显示错误。