1

我有自己的班级,应该进行请求和数据处理(解析)。这个类应该在不同的视图控制器中使用。在这个类中,我实现了:

- (void)sendRequest:(NSString *)url;
- (void)requestFinished:(ASIHTTPRequest *)request;
- (void)requestFailed:(ASIHTTPRequest *)request;
- (id)parse:(NSString *)aString;

我创建了一个名为 result 的属性。如果请求到达,则调用 requestFinished。在 requestFinished 中,结果保存在 result 中。我想如果我在 sendRequest 中返回一个值,我会得到结果。但正如我之前提到的 requestFinished 得到结果,所以 sendRequest 总是返回一个 nil 变量,因为那时请求还没有完成。

我该怎么做才能返回结果?我希望这个类可以从不同的视图控制器中使用。所以我的第一个想法是在我的视图控制器中创建一个方法并传递结果是行不通的。

我阅读了有关使用视图控制器作为委托的 ASIHTTPRequest "requestFinished" Back to Originating Method这个线程。但后来我想我必须在视图控制器中实现 requestFinished 和 requestFailed 。在不同的视图控制器中没有重复代码的想法将会消失......

有人可以帮忙吗?

4

1 回答 1

0

所以最后我和一个代表一起做了。

在我的抽象类 (*.h) 中,我定义了以下内容,否则你会得到

警告:没有找到'-setDarkness:'方法

警告:(将假定没有匹配方法签名的消息

警告:返回 'id' 并接受 '..' 作为论据。)

@protocol RssParserDelegate <NSObject>  
    - (void)displayResults:(NSDictionary *)parserResults;
@end

比我在我的抽象类 (*.h) 中声明一个实例变量和一些方法:

id _delegate;
// ...
- (id)delegate;  
- (void)setDelegate:(id)new_delegate;

因此,声明看起来像 (*.m):

 - (id)delegate {  
     return _delegate;  
 }  

 - (void)setDelegate:(id)new_delegate {  
     _delegate = new_delegate;  
 }

要传递结果,您必须将以下代码放在 requestFailed 和 requestFinished 上:

if ([_delegate respondsToSelector:@selector(displayResults:)])
    [_delegate displayResults:results];
else  
{   
    [NSException raise:NSInternalInconsistencyException  
                format:@"Delegate doesn't respond to displayResults:"];  
}

我重新定义了 sendRequest 并将传入的委托设置为我的实例变量:

- (void)sendRequest:(NSString *)url withDelegate:(id)aDelegate {
    // set delegate to populate the results later
    [self setDelegate:aDelegate]; 

在您的视图控制器中声明此方法:

- (void)displayResults:(NSDictionary *)results {
     // do some data processing
     ...
     // show data
     [self.tableView reloadData];
}

而且我还将方法调用更改为我的抽象类的 sendRequest :

[yourRequest sendRequest:@"xxx" withDelegate:self]; 
于 2010-09-03T11:57:27.350 回答