e***t 发帖数: 78 | 1 连接网络的异步操作问题:
我当前页面是从前一个页面 Push 来的
(当前页面的左上角有个回去的按纽,随时能够回到上一页面。)
当前页面上有另外一个按纽,点它之后有NSURLConnection,
发的是 sendAsynchronousRequest 的下载请求
(我有个UIActivityIndicatorView跳出来表示后台正在下载...)
我在当前页面上有URL连接的响应函数来处理下载成功/失败,比如当异步完成,
跳出Alert窗口
现在的问题是:当用户点完这个下载按纽之后,马上就点左上角的按纽转回前一页,
之后一会儿,下载完后的那个alert显示出来,一点OK
程序就死掉了(Thread 1: EXC_BAD_ACCESS(code=1, address=0xf08aa010)
请问象我这样异步操作的,应该怎么处理?
是不是当前页面不能从Push来,得从Modal来,然后是由我来控制每一个页面的跳转,
如果用户在异步操作完成以前想转走到别的页面,我就不让转走?
还是说有什么更好的处理方法?
谢谢! |
i*****o 发帖数: 1714 | 2 在你当前页面disappear之前cancel pending connection是必须的功课之一。
★ 发自iPhone App: ChineseWeb 8.6
【在 e***t 的大作中提到】 : 连接网络的异步操作问题: : 我当前页面是从前一个页面 Push 来的 : (当前页面的左上角有个回去的按纽,随时能够回到上一页面。) : 当前页面上有另外一个按纽,点它之后有NSURLConnection, : 发的是 sendAsynchronousRequest 的下载请求 : (我有个UIActivityIndicatorView跳出来表示后台正在下载...) : 我在当前页面上有URL连接的响应函数来处理下载成功/失败,比如当异步完成, : 跳出Alert窗口 : 现在的问题是:当用户点完这个下载按纽之后,马上就点左上角的按纽转回前一页, : 之后一会儿,下载完后的那个alert显示出来,一点OK
|
X****r 发帖数: 3557 | 3 If the asynchronous request no longer makes sense once user
navigates away, cancel the request; if it still does, make
sure that your code that handles the response works correctly
after the original view/controller is no longer there:
- don't depend on objects (e.g. UI components) that no longer
exists.
- have strong references to all data it needs, and don't
forget to release them once you're done.
- only opens the alert view in the main UI thread, e.g.
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView* alert = ...
});
【在 e***t 的大作中提到】 : 连接网络的异步操作问题: : 我当前页面是从前一个页面 Push 来的 : (当前页面的左上角有个回去的按纽,随时能够回到上一页面。) : 当前页面上有另外一个按纽,点它之后有NSURLConnection, : 发的是 sendAsynchronousRequest 的下载请求 : (我有个UIActivityIndicatorView跳出来表示后台正在下载...) : 我在当前页面上有URL连接的响应函数来处理下载成功/失败,比如当异步完成, : 跳出Alert窗口 : 现在的问题是:当用户点完这个下载按纽之后,马上就点左上角的按纽转回前一页, : 之后一会儿,下载完后的那个alert显示出来,一点OK
|
b******0 发帖数: 101 | 4 不要用会消失的页面做delegate。用根VC或者Appdelegate做delegate。下载完成后
post notification。在可能消失的VC里加observer。 |
e***t 发帖数: 78 | 5 我用的是
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[urlRequest set...];
[NSURLConnection sendAsynchronousRequest:urlRequest
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *
error)
{ ..... }
];
不知道怎么cancel它?
我以为可以 NSURLConnection *conn = [NSURLConnection sendAsy... {...}];
然后 [conn cancel];
但编译器说两者类型不同
我用这个competionHandler,主要是想简单点,就一个函数解决了下载的所有问题。
否则要写那几个 connection didReceiveResponse, didReceiveData, didFinish
【在 i*****o 的大作中提到】 : 在你当前页面disappear之前cancel pending connection是必须的功课之一。 : : ★ 发自iPhone App: ChineseWeb 8.6
|
i*****o 发帖数: 1714 | 6 你这个是不能cancel的。只能换method,或者像前面几位说的,keep 一个strong
reference of self。
★ 发自iPhone App: ChineseWeb 8.6
【在 e***t 的大作中提到】 : 我用的是 : NSURL *url = [NSURL URLWithString:urlString]; : NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; : [urlRequest set...]; : [NSURLConnection sendAsynchronousRequest:urlRequest : queue:[NSOperationQueue mainQueue] : completionHandler:^(NSURLResponse *response, NSData *data, NSError * : error) : { ..... } : ];
|
e***t 发帖数: 78 | 7 多谢你的回复!
我改Async的那个block方式,变成了那几个 didReceiveResponse/data 函数。
现在的问题是,-(void)dealloc 它好象不是马上响应的。
我点了左上角的回到上一级页面,然后在dealloc里cancel connection,
但这个dealloc在我的connection都已经差不多完了才执行,根本没有起到cancel的作用
于是我把 [connection cancel]; 移到另外一个里:-(void)viewWillDisappera
这回到是能cancel,
我想请较的是,我在这个viewWillDisappear里面操作有没有什么潜在的问题?
【在 i*****o 的大作中提到】 : 你这个是不能cancel的。只能换method,或者像前面几位说的,keep 一个strong : reference of self。 : : ★ 发自iPhone App: ChineseWeb 8.6
|
m***t 发帖数: 254 | 8 这个是正解。
【在 b******0 的大作中提到】 : 不要用会消失的页面做delegate。用根VC或者Appdelegate做delegate。下载完成后 : post notification。在可能消失的VC里加observer。
|
i*****o 发帖数: 1714 | 9 试试打电话进来,如果没问题就可以了。
作用
★ 发自iPhone App: ChineseWeb 8.6
【在 e***t 的大作中提到】 : 多谢你的回复! : 我改Async的那个block方式,变成了那几个 didReceiveResponse/data 函数。 : 现在的问题是,-(void)dealloc 它好象不是马上响应的。 : 我点了左上角的回到上一级页面,然后在dealloc里cancel connection, : 但这个dealloc在我的connection都已经差不多完了才执行,根本没有起到cancel的作用 : 于是我把 [connection cancel]; 移到另外一个里:-(void)viewWillDisappera : 这回到是能cancel, : 我想请较的是,我在这个viewWillDisappear里面操作有没有什么潜在的问题?
|
c***d 发帖数: 996 | 10 页面disappear和connection有什么关系呢? connection一般都是在model里面, view
消失了也未必要cancel connection.
【在 i*****o 的大作中提到】 : 在你当前页面disappear之前cancel pending connection是必须的功课之一。 : : ★ 发自iPhone App: ChineseWeb 8.6
|
b******0 发帖数: 101 | 11
view
看他说的意思应该是有个callback。页面消失后再去access就出问题了。
【在 c***d 的大作中提到】 : 页面disappear和connection有什么关系呢? connection一般都是在model里面, view : 消失了也未必要cancel connection.
|