用于回调的 iOS NSError/NSDictionary

Posted

技术标签:

【中文标题】用于回调的 iOS NSError/NSDictionary【英文标题】:iOS NSError/NSDictionary for callbacks 【发布时间】:2014-09-17 07:00:27 【问题描述】:

我正在开发一个需要错误回调的框架。我使用委托方法向框架的用户(开发人员)提供错误回调。我可以使用 NSError 来指示委托方法中的错误详细信息,还是直接使用 NSDictionary 来代替?这里是否存在内存问题?

【问题讨论】:

nshipster.com/nserror ?您将看到NSError 背后的内容(作为userInfo 中的NSDictionary)。我建议您使用NSError,这对开发人员来说更常见。 【参考方案1】:

您应该使用具有适当错误处理的块来代替委托方法,如下所示:

界面:

typedef void(^ResultBlock)(id result, NSError *error);

extern NSString * const DummyErrorDomain;

enum
    DummyErrorReason1,
    DummyErrorReason2
;

@interface Dummy : NSObject

-(void)doSomething:(ResultBlock)resultBlock;

@end

使用异步 NSURLConnection 实现:

NSString * const DummyErrorDomain = @"DummyErrorDomain";

@interface Dummy ()

@property (strong) ResultBlock resultBlock;
@property NSURLConnection *connection;
@property NSMutableData *responseData;

@end

@implementation Dummy

-(void)doSomething:(ResultBlock)resultBlock

    self.resultBlock = resultBlock;
    self.responseData = [[NSMutableData alloc] init];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"dummyURL"]];

     self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];


-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    self.resultBlock(nil,error);


-(void)connectionDidFinishLoading:(NSURLConnection *)connection
    self.resultBlock(self.responseData, nil);


-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    [self.responseData appendData:data];


@end

用法:

-(void)usage

    Dummy *dummy = [[Dummy alloc] init];

    [dummy doSomething:^(id result, NSError *error) 
        if(result)
            // everything went fine
        else
            // error handling
        
    ];

【讨论】:

我使用委托来连接服务器、获取数据、对其进行排序并通过不同的委托方法向开发人员发送不同类型的数据。服务器调用是异步的。这就是使用协议的原因。上述动机是否可以通过block方法实现? 你最好开始学习积木可以做什么。如果你不知道如何使用块,你就会错过很多让你的代码更容易编写和理解的机会。 是的,这完全有可能。您保存 resultBlock,然后从异步委托方法中调用它。 由于很多委托方法都使用NSError,我不知道为什么在所有情况下阻塞都会更好。这实际上取决于您想要实现的目标以及您如何设计代码/应用程序。我并不是说块或委托比另一个更好,但仍然有两个合乎逻辑的强大。 @KaszásDávid 你能提供一些关于如何使用块进行异步工作流的教程吗?

以上是关于用于回调的 iOS NSError/NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIActionSheet 回调适用于模拟器,但不适用于手机

用于jquery的html5视频上的iOS“完成”回调按钮

音频回调线程中的内存泄漏(iOS)

socket io发出失败的回调

Firebase FEventTypeChildAdded 回调被多次调用,用于同一个新对象

没有在 NSObject 类 ios swift 中获取委托方法的回调