iOS要用但不想記的東西

weixin_33782386發表於2018-04-28

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>

相關文章