2010-08-19 61 views
0

如何创建一个包含它自己的委托的新文件,以便我可以创建一个ASIHTTPRequest以及它自己的异步结束,以及足够简单的事情,我只需要将[request setDelegate:self];设置为[request setDelegate:AlternateDelegate];之类的东西,并且只需在开始时添加一个include的文档来引用AlternateDelegate委托ASIHTTPRequest异步的另一个代表?

+0

我真的不明白你在问什么 - 你问如何创建一个新的目标C类? – JosephH 2010-08-19 09:41:16

+0

只是想为文件创建另一个委托。 – 2010-08-19 16:00:33

回答

1

我知道这个问题是旧的,但如果有人遇到它:

@Hankweb seemes在谈论使用请求作为自己的代表。这当然有一些情况。例如,我正在开发一个项目,该项目使用ASIHTTPRequest从远程源获取JSON并将其导入到Core Data存储中。

此操作(字面上,ASIHTTPRequestNSOperation的子类)几乎完全自包含;我在后台线程上使用流式JSON解析器将对象导入到NSManagedObjectContext中进行自定义请求,该对象在保存时触发一条内部捕获的通知,并使用performSelectorOnMainThread:waitUntilDone:传递到主线程的上下文。

我正在使用ASIHTTPRequest的块支持来完成此操作;在我的自定义initWithURL:方法中,我设置了相关回调(dataReceivedBlock,completionBlockfailureBlock等)。不过,传统的委托模式(使用ASIHTTPRequestDelegate协议)也应该可行。

一个问题:你应该确保请求不会自己保留太多时间,否则你最终会发生内存泄漏。当使用多线程时,这很容易错过,特别是在使用块时。相反的:

- (id)initWithURL:(NSURL *aURL) { 
    //... 
    [self setCompletionBlock:^{ 
    [self doSomething]; 
    }]; 
    //... 
    return self; 
} 

引用块内self时使用__weak属性(或__block如果使用ARC是):

- (id)initWithURL:(NSURL *aURL) { 
    //... 
    __weak id blockSelf = self; 
    [self setCompletionBlock:^{ 
    [blockSelf doSomething]; 
    }]; 
    //... 
    return self; 
} 

如果你不知道这是为什么重要的是,请务必阅读Apple's guide to blocks in Objective-CASIHTTPRequest block API documentation

1

ASIHTTPRequest的委托只是一个标准的目标C对象。只需创建一个新类,包含它的标题,创建/获取对象并将委托设置为该对象。

你有没有试过这个,并遇到问题?如果是这样的问题是什么?