數組排序、寫入文件和GCD

- (NSString *)fileLocation{
//獲取文件路徑(返回值是一個數組),其實就只有一個值
 NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    if ([folders count] == 0) {
        return nil;
    }
    NSString *documentsFolder = folders[0];
    return [documentsFolder stringByAppendingString:@"list2.txt"];
}

- (BOOL)hasFileAlreadyBeenCreated{  //判斷文件是否存在
    BOOL result = NO;
    NSFileManager *fileManger = [[NSFileManager alloc] init];
    if ([fileManger fileExistsAtPath:[self fileLocation]]) {
        return YES;
    }
    return result;
}

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(concurrentQueue, ^{  //開啓一個異步操做,gcd隊列是concurrentQueue
        NSInteger numberOfValueRequired = 10;
        if ([self hasFileAlreadyBeenCreated] == NO) { //是否文件已存在,
            dispatch_sync(concurrentQueue, ^{  //不存在
                NSMutableArray *arrayOfRandomNumbers = [[NSMutableArray alloc] initWithCapacity:numberOfValueRequired];
                NSInteger counter = 0;
                for (counter = 0; counter < numberOfValueRequired; counter++) {
                    unsigned int randomNumber = arc4random()%((unsigned int)RAND_MAX + 1);
                    [arrayOfRandomNumbers addObject:[NSNumber numberWithUnsignedInt:randomNumber]];
                }
                [arrayOfRandomNumbers writeToFile:[self fileLocation] atomically:YES];
            });
        }
    __block NSMutableArray *randomNumbers = nil;
    dispatch_sync(concurrentQueue, ^{  
        if ([self hasFileAlreadyBeenCreated]) {  //文件存在
            randomNumbers = [[NSMutableArray alloc] initWithContentsOfFile:[self fileLocation]];
            NSLog(@"Self Location is %@",[self fileLocation]);
            NSArray * sortArray = [randomNumbers sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                NSNumber *number1 = (NSNumber *)obj1;
                NSNumber *number2 = (NSNumber *)obj2;
                return [number1 compare:number2];
            }];
            NSLog(@"kkkk %@",sortArray);
            [sortArray writeToFile:[self fileLocation] atomically:YES];
        }
    });
 }
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@4,@7,@2,@8,@1,@7,@6,@9, nil ];
   // NSMutableArray *mutaleArray = [[NSMutableArray alloc] initWithArray:array];
    NSArray *sortArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSNumber *N1 = (NSNumber *)obj1;
        NSNumber *N2 = (NSNumber *)obj2;
        return [N1 compare:N2];
        /*if(obj1 > obj2){  //第二種方法
            return NSOrderedAscending;
          }else{
            return NSOrderedDecending
          }
        */
 }];
    for (int i = 0; i < sortArray.count; i++) {
        NSLog(@"Number is %@",sortArray[i]);
    }
}


  
  
  
  
  

 

NSSortDescriptor 指定用於對象數組排序的對象的屬性。 數組

若是是Employee對象須要按照name來排序,就生成下面的descriptor dom

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:name ascending:YES]; 異步

若是須要多個排序,好比先按name排序,再按入職日期排序。那就建立兩個descriptor async

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:hireDate ascending:YES]; ui

兩個descriptor放到數組裏一塊兒傳給須要排序的數組。 atom


若是對象就是NSString,就是字符串數組排序,那更簡單了,sortdescriptor的key直接指定爲nil,就直接排序對象,而不是對象的某一個屬性了。 spa

   NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES]; code

  NSArray *descriptors = [NSArray arrayWithObject:descriptor]; 對象

   NSArray *myDataArray = [NSArray arrayWithObjects:@"what", @"xero", @"highligth", @"mountain", @"Victory", @"Balance", nil]; 排序

  NSArray *resultArray = [myDataArray sortedArrayUsingDescriptors:descriptors];

  NSLog(@"%@", resultArray);


NSArray 使用sortedArrayUsingDescriptors,返回排序好的數組。

NSMutableArray能夠直接使用sortUsingDescriptors,對數組自己排序。

相關文章
相關標籤/搜索