iOS要用但不想記的東西
1.沙盒檔案路徑
//沙盒檔案路徑
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) firstObject];
2.編譯包位置
上邊路徑的位置回退三層找到Bundle資料夾,下翻Application裡邊就有該版本模擬器的所有編譯包
3.獲取app版本號
NSString *versionNumber = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
4.設定聯網請求狀態(狀態列上的菊花轉圈)
//設定NO 就停止
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
5.設定應用程式圖示的小紅數字
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:10];
//注意:顯示需要註冊使用者badge使用者通知
[[UIApplication sharedApplication] registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge |UIUserNotificationTypeSound |UIUserNotificationTypeAlert categories:nil]];
6.main.m檔案main函式註解
From:Apple Developer Documentation
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
①Main.m檔案
main例程只做三件事:
1.建立一一個自動釋放池,
2.呼叫UIApplicationMain函式,
3.釋放自動釋放池。
② UIApplicationMain函式
1)引數釋義:
- argc和argv是ISO C標準的main函式的引數,直接傳遞給UIApplicationMain進行相關處理。
- principalClassName是應用程式類的名字(字串型別),該類必須繼承自UIApplication類。如果傳入
nil
,系統就預設@"UIApplication"
。- delegateClassName是應用程式類的代理類.如果主要nib檔案(在info.plist檔案中指定,key是NSMainNibFile)存在,就會在nib檔案物件裡尋找Application物件和連線它的delegate。
2).作用:
1.根據principalClassName提供的類名建立
UIApplication
物件
2.利用delegateClassName建立一個delegate物件,並將UIApplication物件中的delegate屬性設定為delegate物件
3.開啟一個主行迴圈,準備接收處理事件
4.載入info.plist檔案,根據info配置載入應用程式
7、iOS程式啟動過程
開啟程式--->
執行main函式--->
執行UIApplicationMain函式--->
初始化UIApplication(建立和設定代理物件,開啟事件迴圈)--->
監聽系統事件--->
通知UIApplicationDelegate物件--->
建立視窗Window--->
初始化根控制器的view--->
將控制器的view加到window上--->
現在控制器的view就顯示到螢幕上了
8、執行緒間的通訊
①Perform
//子 呼叫 主
[self performSelectorOnMainThread:@selector(callMainThread:) withObject:@"object" waitUntilDone:NO];
//新開闢一條執行緒執行一些操作
[self performSelectorInBackground:@selector(callSubThread:) withObject:nil];
// 任意執行緒 呼叫 任意執行緒
[self performSelector:@selector(selector) onThread:thread withObject:nil waitUntilDone:NO];
- 引數waitUntilDone:是否要等待被通訊執行緒做完這個事情再走下面的子執行緒.YES:阻塞當前執行緒等被通訊執行緒任務執行完畢以後再走當前執行緒下面的操作。通俗點:YES:我給你傳個訊息,我看著這個訊息處理完之後,我再幹我的事情。 NO:不等,我只發個訊息就不管了。
- 引數 Object被呼叫
SEL
傳遞的引數
② GCD 通訊
//獲取全域性併發佇列,新增下載圖片任務
1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
2. NSURL *url = [NSURL URLWithString:@"https://upload-images.jianshu.io/upload_images/6687791-5ad29d1a5c1c84db.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"];
3. UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
4. dispatch_async(dispatch_get_main_queue(), ^{
//回到主執行緒重新整理UI
[self.imageVIew setImage:image];
5. NSLog(@"主執行緒任務"); ;
});
6. NSLog(@"下載任務子執行緒");
});
//列印結果 : 先列印 下載任務子執行緒 再列印 主執行緒任務
如果將第4行的非同步函式改成同步函式 dispatch_sync(dispatch_get_main_queue(), ^{
的話,那麼列印順序就是 :先主執行緒任務 再 列印 下載任務子執行緒
原因:sync 同步函式立即觸發執行任務再向下執行,async 非同步函式是等當前任務做完再開始佇列任務
③NSOperation
// 1.建立佇列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// 2.新增操作
[queue addOperationWithBlock:^{
// 非同步進行耗時操作
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2]; // 模擬耗時操作
NSLog(@"1---%@", [NSThread currentThread]); // 列印當前執行緒
}
// 回到主執行緒
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 進行一些 UI 重新整理等操作
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2]; // 模擬耗時操作
NSLog(@"2---%@", [NSThread currentThread]); // 列印當前執行緒
}
}];
}];
④NSPort埠
在子執行緒持有一個主執行緒的埠,通過這個埠進行通訊。其常用子類有NSMessagePort
NSMachPort
。同樣 主執行緒也可以持有子執行緒的埠,進行主執行緒call子執行緒
9、檔案移動
把from
資料夾下的檔案全部剪下到to
資料夾下
NSString *from = @"/Users/**/Desktop/des/Form";
NSString *to = @"/Users/**/Desktop/des/TO";
NSFileManager *fmg = [NSFileManager defaultManager];
NSArray *array = [fmg subpathsAtPath:from];
dispatch_apply(array.count, dispatch_get_global_queue(0, 0), ^(size_t index) {
NSString *subsPath = array[index];
NSString *fromFullPath = [from stringByAppendingPathComponent:subsPath];
NSString *toFullPath = [to stringByAppendingPathComponent:subsPath];
[fmg moveItemAtPath:fromFullPath toPath:toFullPath error:nil];
});
10、iOS 沙盒檔案的寫入與讀取相關
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
static BOOL flag = NO;
if (flag == YES) {
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *imagePath = [filePath stringByAppendingPathComponent:@"download.jpeg"];
if ([[NSFileManager defaultManager] removeItemAtPath:imagePath error:nil]) {
NSLog(@"刪除成功檔案");
};
flag = NO;
return;
}
flag = YES;
__block NSData *data = nil;
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSBlockOperation *downloadOperation = [NSBlockOperation blockOperationWithBlock:^{
NSURL *url = [NSURL URLWithString:@"https://upload-images.jianshu.io/upload_images/6687791-5ad29d1a5c1c84db.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"];
data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
NSLog(@"%@",[NSThread currentThread]);
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
}];
NSBlockOperation *writeBlock = [NSBlockOperation blockOperationWithBlock:^{
if (data) {
//將data寫入沙盒caches路徑
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *imagePath = [filePath stringByAppendingPathComponent:@"download.jpeg"];
NSLog(@"%@",imagePath);
if ([data writeToFile:imagePath atomically:YES]) {
data = nil;
}
}
}];
//獲取剛寫入檔案屬性block
NSBlockOperation *attributeBlock = [NSBlockOperation blockOperationWithBlock:^{
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *imagePath = [filePath stringByAppendingPathComponent:@"download.jpeg"];
NSError *error = nil;
//獲取檔案屬性
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:imagePath error:&error];
NSLog(@"%@",dict);
}];
[writeBlock addDependency:downloadOperation];
[attributeBlock addDependency:writeBlock];
[queue addOperation:downloadOperation];
[queue addOperation:writeBlock];
[queue addOperation:attributeBlock];
}
11、info.plist常用
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSAppleMusicUsageDescription</key>
<string>App需要您的同意,才能訪問媒體資料庫</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App需要您的同意,才能訪問藍芽</string>
<key>NSCalendarsUsageDescription</key>
<string>App需要您的同意,才能訪問日曆</string>
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能訪問相機</string>
<key>NSHealthShareUsageDescription</key>
<string>App需要您的同意,才能訪問健康分享</string>
<key>NSHealthUpdateUsageDescription</key>
<string>App需要您的同意,才能訪問健康更新 </string>
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始終訪問位置</string>
<key>NSLocationUsageDescription</key>
<string>App需要您的同意,才能訪問位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App需要您的同意,才能在使用期間訪問位置</string>
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能訪問麥克風</string>
<key>NSMotionUsageDescription</key>
<string>App需要您的同意,才能訪問運動與健身</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能訪問相簿</string>
<key>NSRemindersUsageDescription</key>
<string>App需要您的同意,才能訪問提醒事項</string>
相關文章
- 記錄一些細碎的東西
- Cesium筆記----關於viewer的配置及常用東西筆記View
- 怪東西
- 想學 iOS 開發高階一點的東西,從何開始?iOS
- “東數西算”超級工程上馬,利好雲端計算但暗藏洶湧
- 未來學東西的思路
- 筆試不會的東西筆試
- 夢是個神奇的東西
- c盤沒東西但顯示滿了win10怎麼辦_win10系統c盤沒東西但是滿了如何處理Win10
- Kubernetes 學習筆記-- kafka往couchdb裡倒東西筆記Kafka
- PHPSTORM 相關東西PHPORM
- 計組那些容易搞混的東西
- 近期做的一些東西
- Linux 命令列下的好東西Linux命令列
- 深度學習記錄(1)metricLogger是個什麼東西?深度學習
- env 是個好東西
- 東拼西湊學javaJava
- opacity這個小東西
- 近來學習的一點東西
- [譯]JS裡我才知道的東西JS
- APP許可權相關的東西APP
- 這是什麼東西呢?
- 東數西算“芯”基建GK
- 框架是個什麼東西?框架
- 腦子是個好東西
- flutter engine 那些沒被釋放的東西Flutter
- Android,你要掌握的一些東西Android
- 10,函式和方法相關的東西函式
- 一個有意思的數學東西
- 用Golang做點自動化的東西Golang
- ftp下載其他電腦上的東西FTP
- Java面試前需要了解的東西Java面試
- js中的arguments是一個好東西JS
- 坑:那些需要我重新學習/理解的東西
- golang 在 runtime 中的一些騷東西Golang
- 通過 find 命令找到你要找的東西
- git裡最有用最經常使用的東西Git
- 關於 Gradle 依賴庫的幾個東西Gradle