创建:2011.05.24日期:2011.05
当程序注销之后,程序需要释放所有资源,并还原设置,以等待新的用户登录。
但是,这个过程并不简单。
它应该包括3个方面的内容:
# UI的还原
# 在后台执行的线程的关闭,即NSOperation的处理
# Session的操作
==对于UI还原的处理==
对于UI的还原,比较好处理。除了Window外,
每次都重新加载全部的UI。
在Login的VC中进行加载。或者在自动登录处理结束之后在加载。
# 注册一个注销消息的Notification(如:SessionLogoutNotification)。
- (void)handleAppLogoutNotification:(NSNotification *)notification {
[self AD_showLoadingView];
[self AD_showLoginViewController];
// 淡出Loading动画。
[self AD_hiddenLoadingView];# 取消一切后台运行设置的控制字段。
# 调用Session中的NSOperationQueue的cancelAllOperations。
# 检查queue的op数目是否都为0。
##如果是,则删除Session。将AppDelegate的currentSession设置为nil。返回。
## 如果是否,则:
### 将当前Session放到“已注销Session数组”里面。
### 将AppDelegate的currentSession设置为nil。
### 设定一个定时器,并不断的检查“已注销Session数组”里面的每个session的queue的op是否都为0,如果有,则从“已注销Session数组”里面中删除该session。
# 发送注销消息的Notification,让UI进行还原。
例如:
// LogoutAction
- (BOOL)run {
NSDictionary *jsonValue = xxxxxx; // 网络请求
BOOL success = xxxxxx; // 判断是否注销成功了。
if (success) {
[gGlobal() globalLogout];
}
return success;
}
// YDTSession
- (void)sessionLogout {
mIsLogin = NO;
[self saveInformation];
// 取消上传。
gSession().mMediaFileList.isNeedStopAndRelease = YES;
[mQueueManager cancelAllQueueOperations];
}
// YDTGlobal
- (void)globalLogout {
// 用于自动登录。
gGlobal().mPrevPhone = nil;
gGlobal().mPrevPassword = nil;
[gGlobal() saveInformation];
[gSession() sessionLogout];
if ([mYDTSession isSessionCanRelease]) {
self.mYDTSession = nil;
return;
}
// 如果当前仍有Op要处理,则使用Timer不停检测。
[self G_AddLogoutSession:self.mYDTSession];
self.mYDTSession = nil;
[mLogoutTimer performSelectorOnMainThread:@selector(fire) withObject:nil waitUntilDone:NO];
}
+++++