項(xiàng)目總結(jié)(一)

  • 圓角陰影的使用導(dǎo)致界面卡頓尤其是在UICollectionView和UITableView中的使用,以下代碼大部分情況下可以馬上把你的幀數(shù)提高在55幀每秒以上聋伦,它會(huì)使視圖渲染內(nèi)容被緩存起來(lái)有序,下次繪制的時(shí)候可以直接顯示緩存报慕,當(dāng)然要在視圖內(nèi)容不改變的情況下豆巨。
self.layer.shouldRasterize = YES;  
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
  • 同時(shí)實(shí)現(xiàn)陰影和圓角(弄一個(gè)和圖片大小一樣的view畜侦,然后把UIImageView放到里面元扔,代碼如下)
self.headImage.layer.cornerRadius = 10;
    self.headImage.layer.masksToBounds = YES;
    
    self.shadowView.layer.shadowColor = RGB(40, 45, 65).CGColor;
    self.shadowView.layer.shadowOffset = CGSizeMake(1, 2);
    self.shadowView.layer.shadowOpacity = 0.1;
    self.shadowView.layer.shadowRadius = 4.0;
    self.shadowView.layer.cornerRadius = 4.0;
    self.shadowView.clipsToBounds = NO;
  • 使用 plist 存儲(chǔ)的自定義對(duì)象時(shí)需要注意得時(shí)取出來(lái)的對(duì)象為不可變的,直接修改可能失敗報(bào)錯(cuò)
    存儲(chǔ)自定義對(duì)象要進(jìn)行編解碼把需要存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)換為NSData類(lèi)型旋膳,取出來(lái)的時(shí)候再將NSData轉(zhuǎn)換成自己的類(lèi)型 Model需要繼承NSCoding澎语,實(shí)現(xiàn)以下方法
/** 給自定義Model進(jìn)行編碼 */
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.ID forKey:@"id"];
    [aCoder encodeObject:self.userCode forKey:@"userCode"];
    [aCoder encodeObject:self.userName forKey:@"userName"];
    [aCoder encodeObject:self.password forKey:@"password"];
    [aCoder encodeObject:self.status forKey:@"status"];
    [aCoder encodeObject:self.createTime forKey:@"createTime"];
    [aCoder encodeObject:self.mobileNumber forKey:@"mobileNumber"];
    [aCoder encodeObject:self.headImageName forKey:@"headImageName"];
    [aCoder encodeBool:self.isOnWiFiDownLoad forKey:@"isOnWiFiDownLoad"];
    [aCoder encodeBool:self.isAcceptInfo forKey:@"isAcceptInfo"];
}

/** 使用的時(shí)候還要進(jìn)行解碼 */
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        self.ID = [aDecoder decodeObjectForKey:@"id"];
        self.userCode = [aDecoder decodeObjectForKey:@"userCode"];
        self.userName = [aDecoder decodeObjectForKey:@"userName"];
        self.password = [aDecoder decodeObjectForKey:@"password"];
        self.status = [aDecoder decodeObjectForKey:@"status"];
        self.createTime = [aDecoder decodeObjectForKey:@"createTime"];
        self.mobileNumber = [aDecoder decodeObjectForKey:@"mobileNumber"];
        self.headImageName = [aDecoder decodeObjectForKey:@"headImageName"];
        self.isAcceptInfo = [aDecoder decodeBoolForKey:@"isAcceptInfo"];
        self.isOnWiFiDownLoad = [aDecoder decodeBoolForKey:@"isOnWiFiDownLoad"];
    }
    return self;
}

如果需要修改存儲(chǔ)到plist 文件中的自定義模型的數(shù)據(jù),必須要把從plist文件中取出來(lái)的自定義對(duì)象變?yōu)榭勺儗?duì)象溺忧,這樣操作才會(huì)有效咏连,把不可變對(duì)象變?yōu)榭勺儗?duì)象 需要使Model繼承NSMutableCopying 實(shí)現(xiàn)以下方法

- (id)mutableCopyWithZone:(NSZone *)zone{
    FXUserInfoModel *model = [[FXUserInfoModel allocWithZone:zone] init];
    model.ID = self.ID;
    model.userCode = self.userCode;
    model.userName =  self.userName;
    model.password =  self.password;
    model.status    =self.status;
    model.createTime = self.createTime;
    model.mobileNumber = self.mobileNumber;
    model.headImageName = self.headImageName;
    model.isAcceptInfo = self.isAcceptInfo;
    model.isOnWiFiDownLoad = self.isOnWiFiDownLoad;
    return model;
}
  • 具體操作:
/** 從plist 中取出自定義對(duì)象*/
 FXUserInfoModel *model = [[FXManager loadCustomObjectWithKey:[NSString stringWithFormat:@"%@+%@",@"FXUserInfoModel",[UserDefaultsUtils valueWithKey:@"userID"]]] mutableCopy];

/** 修改從plist中取出來(lái)的值 */
model.isOnWiFiDownLoad = NO;

/** 把修改后的值重新存回去 */
 [FXManager saveCustomObject:model withKey:[NSString stringWithFormat:@"%@+%@",@"FXUserInfoModel",[UserDefaultsUtils valueWithKey:@"userID"]]];

······完美解決
  • 如何實(shí)現(xiàn)互斥登陸情竹,即同一賬號(hào)只能同時(shí)在線(xiàn)一個(gè)用戶(hù)已艰,實(shí)現(xiàn)原理,服務(wù)器+友盟推送 實(shí)現(xiàn)同時(shí)只能在線(xiàn)一個(gè)賬號(hào)
  1. 移動(dòng)端需要我們?cè)O(shè)置HTTP請(qǐng)求頭绿饵,給請(qǐng)求頭傳入和服務(wù)器端事先約定好的參數(shù)歌溉,這里我們傳入兩個(gè)參數(shù):apiKey 垄懂,userId骑晶。第一個(gè)參數(shù)傳注冊(cè)友盟推送的時(shí)候系統(tǒng)回調(diào)傳回來(lái)的deviceToken 這個(gè)參數(shù)是為了讓后太推送確定把消息推送給指定的被下線(xiàn)的用戶(hù),第二個(gè)參數(shù)是為了確定用戶(hù)的ID登錄狀態(tài)草慧,我們還需要監(jiān)聽(tīng)收到的通知桶蛔,屆時(shí)讓服務(wù)器端配置一個(gè)自定義參數(shù)用于識(shí)別是否是下線(xiàn)通知,如果是漫谷,我們?cè)诋?dāng)前界面做出響應(yīng)仔雷,提示用戶(hù)已下線(xiàn)。2.服務(wù)器端根據(jù)請(qǐng)求頭的數(shù)據(jù)做出是否推送消息的動(dòng)作舔示,如果需要推送消息碟婆,則發(fā)送與移動(dòng)端約定好的識(shí)別參數(shù)的通知。 具體代碼如下
/** 第一步 在Application.m獲取手機(jī)注冊(cè)成功友盟推送回調(diào)得到deviceToken并保存 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString *deviceTokenStr = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
                                             stringByReplacingOccurrencesOfString: @">" withString: @""]
                                            stringByReplacingOccurrencesOfString: @" " withString: @""];
    
    [UserDefaultsUtils saveValue:deviceTokenStr forKey:@"apiKey"];
    NSDictionary *parameters = [[NSMutableDictionary alloc] init];
    NSString *userStr =[NSString stringWithFormat:@"%@",[UserDefaultsUtils valueWithKey:@"userID"]];
    if (!userStr || [userStr isEqualToString:@""]) {
        [parameters setValue:userStr forKey:@"userId"];
    }else{
        [parameters setValue:@"" forKey:@"userId"];
    }
    [parameters setValue:[UserDefaultsUtils valueWithKey:@"apiKey"] forKey:@"apiKey"];
    /** 動(dòng)態(tài)設(shè)置請(qǐng)求頭必須每次調(diào)用 updateBaseUrl 方法*/
    [HYBNetworking updateBaseUrl:BaseUrl];
    [HYBNetworking configCommonHttpHeaders:parameters];
}

/** 在前后臺(tái)收到通知的時(shí)候判斷是否為下線(xiàn)通知惕稻,如果是提示用戶(hù)已下線(xiàn)竖共,并且退出當(dāng)前賬號(hào) */
//iOS10新增:處理前臺(tái)收到通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        //應(yīng)用處于前臺(tái)時(shí)的遠(yuǎn)程推送接受
        //關(guān)閉U-Push自帶的彈出框
        [UMessage setAutoAlert:NO];
        //必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
        
        if ([userInfo[@"operationError"] isEqualToString:@"1001"]) {
            UIAlertController *alercConteoller = [UIAlertController alertControllerWithTitle:@"提示" message:@"當(dāng)前賬號(hào)已在其他設(shè)備登錄,您已被迫下線(xiàn)" preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *actionYes = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [self signOutCurrentAccount];
            }];
            [alercConteoller addAction:actionYes];
            [[FXManager getCurrentVC] presentViewController:alercConteoller animated:YES completion:nil];
        }
        
    }else{
        //應(yīng)用處于前臺(tái)時(shí)的本地推送接受
    }
    //當(dāng)應(yīng)用處于前臺(tái)時(shí)提示設(shè)置俺祠,需要哪個(gè)可以設(shè)置哪一個(gè)
    completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);
}

//iOS10新增:處理后臺(tái)點(diǎn)擊通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        //應(yīng)用處于后臺(tái)時(shí)的遠(yuǎn)程推送接受
        //必須加這句代碼
        [UMessage didReceiveRemoteNotification:userInfo];
        if ([userInfo[@"operationError"] isEqualToString:@"1001"]) {
            UIAlertController *alercConteoller = [UIAlertController alertControllerWithTitle:@"提示" message:@"當(dāng)前賬號(hào)已在其他設(shè)備登錄公给,您已被迫下線(xiàn)" preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *actionYes = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                [self signOutCurrentAccount];
            }];
            [alercConteoller addAction:actionYes];
            [[FXManager getCurrentVC] presentViewController:alercConteoller animated:YES completion:nil];
        }
    }else{
        //應(yīng)用處于后臺(tái)時(shí)的本地推送接受
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜘渣,隨后出現(xiàn)的幾起案子淌铐,更是在濱河造成了極大的恐慌,老刑警劉巖宋梧,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣沼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捂龄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)加叁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倦沧,“玉大人,你說(shuō)我怎么就攤上這事它匕≌谷冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵豫柬,是天一觀(guān)的道長(zhǎng)告希。 經(jīng)常有香客問(wèn)我,道長(zhǎng)烧给,這世上最難降的妖魔是什么燕偶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮础嫡,結(jié)果婚禮上指么,老公的妹妹穿的比我還像新娘酝惧。我一直安慰自己,他們只是感情好伯诬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布晚唇。 她就那樣靜靜地躺著,像睡著了一般盗似。 火紅的嫁衣襯著肌膚如雪哩陕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天赫舒,我揣著相機(jī)與錄音悍及,去河邊找鬼。 笑死号阿,一個(gè)胖子當(dāng)著我的面吹牛并鸵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扔涧,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼园担,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枯夜?” 一聲冷哼從身側(cè)響起弯汰,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎湖雹,沒(méi)想到半個(gè)月后咏闪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摔吏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鸽嫂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片征讲。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡据某,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诗箍,到底是詐尸還是另有隱情癣籽,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布滤祖,位于F島的核電站筷狼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匠童。R本人自食惡果不足惜埂材,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俏让。 院中可真熱鬧楞遏,春花似錦茬暇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至预鬓,卻和暖如春巧骚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背格二。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工劈彪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顶猜。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓沧奴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親长窄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滔吠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,124評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)挠日,斷路器疮绷,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 點(diǎn)擊查看原文 Web SDK 開(kāi)發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,761評(píng)論 0 15
  • “君韶,如果沒(méi)有月尚白嚣潜,或許你就不會(huì)這么可憐了冬骚。”君煙疏居高臨下的看著被人壓在地上的我懂算,眼中滿(mǎn)是譏諷只冻。 我嫌惡的甩...
    執(zhí)年就是依晗曦閱讀 253評(píng)論 0 2
  • 今天,我們說(shuō)說(shuō)英雄故事的套路 我走過(guò)的最遠(yuǎn)的路计技,就是那些個(gè)編故事的家伙的套路 其實(shí)這些套路也可以用到演示上來(lái)(宅宅...
    肥宅V閱讀 205評(píng)論 0 1