【问题标题】:ASIHTTPRequest: Results are not populated at the right time when using an asynchronous requestASIHTTPRequest:使用异步请求时未在正确的时间填充结果
【发布时间】:2023-03-21 11:35:01
【问题描述】:

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

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

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

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

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

有人可以帮忙吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch xcode asihttprequest


    【解决方案1】:

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

    在我的抽象类 (*.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]; 
    

    【讨论】:

    • 为什么不让_delegate符合你的协议——就像id&lt;RssParserDelegate&gt; _delegate一样,那么你可以确定它响应displayResults而不需要检查。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多