由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问一个XCode的问题
相关主题
segfault这年头async IO成了流行了
大牛们讨论一下异步编程吧请教一个Node.js的疑惑
同步编程真郁闷多线程,异步,并发冲突,fp和其它
看了一下C#的async await真正对异步有需求的应该是游戏类服务器
parallel programming的复杂性分层/流行工具技术名词scala的基于future并行async程序怎么写
goodbug基本不会编程,就会吹牛逼如何快速处理大量网上xml文件?
看了一下Meteor很不错服务器端纯的asio的异步怎么写?
说了半天异步是大势所趋没什么疑问了给你们推荐个思路:异步
相关话题的讨论汇总
话题: 页面话题: cancel话题: connection话题: 按纽
进入Programming版参与讨论
1 (共1页)
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.

1 (共1页)
进入Programming版参与讨论
相关主题
给你们推荐个思路:异步parallel programming的复杂性分层/流行工具技术名词
ASIO异步一问goodbug基本不会编程,就会吹牛逼
这2个java concurrency + async 轮子, 哪个更好?看了一下Meteor很不错
C++ ASIO异步一问说了半天异步是大势所趋没什么疑问了
segfault这年头async IO成了流行了
大牛们讨论一下异步编程吧请教一个Node.js的疑惑
同步编程真郁闷多线程,异步,并发冲突,fp和其它
看了一下C#的async await真正对异步有需求的应该是游戏类服务器
相关话题的讨论汇总
话题: 页面话题: cancel话题: connection话题: 按纽