2016-11-08 13:30:58 Virgo826627 阅读数 2601

static dispatch_once_t disOnce;  

dispatch_once(&disOnce, ^ {  

//这里写只操作一次的代码  

});

2015-12-01 09:43:37 VNanyesheshou 阅读数 6701

最近公司提供了一个学习iOS的机会,问我是否愿意学习iOS,还是继续只做android开发。我感觉非常幸运,能有此机会去学习iOS,当即说要学习iOS开发。

学习了几天啦,做了一个小demo实现了获取经纬度,海拔,航向,及具体位置信息的功能。

iOS使用定位不像android直接指定使用gps,获取网络获取。iOS定位需要使用Core Location框架,它提供了三种技术来获取位置:GPS、蜂窝或WiFi。

1   GPS卫星  优点最为准确,缺点 耗电量大,不能遮挡(建筑物内不行)

2   WI-FI通过WIFI路由器定位 优点比较省电,经济实惠

3   蜂窝式移动电话基站。通过移动运营商基站定位 误差比较大

在这些技术中,GPS最为精准,如果有GPS硬件,Core Location将优先使用它。如果设备没有GPS硬件(如WiFi iPad)或使用GPS获取当前位置时失败,

Core Location将退而求其次,选择使用WiFi,再次则使用蜂窝。

首先看一下定位的类 CLLocationManager 的方法


要使用位置管理器,必须首先将框架Core Location加入到项目中,再导入其接口文件:

导入框架的过程如下图所示:


#import<CoreLocation/CoreLocation.h>

还需要实现代理CLLocationManagerDelegate
如下ViewController.h

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <CLLocationManagerDelegate>{
    CLLocationManager *_lm;
    NSString *_latitude;
    NSString *_longitude;
}
- (IBAction)startLocation;
- (IBAction)stopLocation;
@property (weak, nonatomic) IBOutlet UILabel *latLon;
@property (weak, nonatomic) IBOutlet UILabel *city;
@property (weak, nonatomic) IBOutlet UILabel *location;
@end

初始化定位服务,定位精度和位置更新距离可以根据上面的方法自行设置。

这里需要提示的是:iOS 8 还提供了更加人性化的定位服务选项。App 的定位服务不再仅仅是关闭或打开。

现在,定位服务的启用提供了三个选项,「永不」「使用应用程序期间」和「始终」。同时,考虑到能耗问题,如果一款 App 要求始终能在后台开启定位服务,iOS 8 不仅会在首次打开 App 时主动向你询问,还会在日常使用中弹窗提醒你该 App 一直在后台使用定位服务,并询问你是否继续允许。在iOS7及以前的版本,如果在应用程序中使用定位服务只要在程序中调用 startUpdatingLocation方法应用就会询问用户是否允许此应用是否允许使用定位服务,同时在提示过程中可以通过在info.plist 中配置通过配置Privacy - Location Usage Description告诉用户使用的目的,同时这个配置是可选的。 
但是在iOS8中配置配置项发生了变化,可以通过配置NSLocationAlwaysUsageDescription或者 NSLocationWhenInUseUsageDescription来告诉用户使用定位服务的目的,并且注意这个配置是必须的,如果不进行配置则默 认情况下应用无法使用定位服务,打开应用不会给出打开定位服务的提示,除非安装后自己设置此应用的定位服务。同时,在应用程序中需要根据配置对 requestAlwaysAuthorization或locationServicesEnabled方法进行请求。


调用方法requesetAlwaysAuthorization则需要在info.plist中配置NSLocationAlwaysUsageDescription,type为string,value可填可不填。

调用方法requesetWhenInUseAuthorization则需要在info.plist中配置NSLocationWhenInUseUsageDescription,type为string,value可可不填。

这样才能获取到位置信息。

#import "ViewController.h"

#define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if ([CLLocationManager locationServicesEnabled]) {
        if (nil == _lm) {
            _lm = [[CLLocationManager alloc]init];
            _lm.delegate = self;
            //设置定位精度
            _lm.desiredAccuracy = kCLLocationAccuracyBest;
            //设置位置更新的最小距离
            _lm.distanceFilter = 100.f;
            if (IS_IOS8) {//ios8之后点版本需要使用下面的方法才能定位。使用一个即可。
                //[_lm requestAlwaysAuthorization];
                [_lm requestWhenInUseAuthorization];
            }
        }
    }else{
        NSLog(@"定位服务不可利用");
    }
}

- (IBAction)startLocation{
    NSLog(@"开始定位");
    [_lm startUpdatingLocation];
}

- (IBAction)stopLocation {
    NSLog(@"停止定位");
    [_lm stopUpdatingLocation];
}


- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    //NSLog(@"location %@",error);
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    _latitude = [NSString stringWithFormat:@"%3.5f",newLocation.coordinate.latitude];
    _longitude = [NSString stringWithFormat:@"%3.5f",newLocation.coordinate.longitude];

}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    // 设备的当前位置
    CLLocation *currLocation = [locations firstObject];
    //获取经纬度
    _latitude = [NSString stringWithFormat:@"%3.5f",currLocation.coordinate.latitude];
    _longitude = [NSString stringWithFormat:@"%3.5f",currLocation.coordinate.longitude];
    _latLon.text =[NSString stringWithFormat:@"lat %@,\nlong %@",_latitude,_longitude];
    //获取海拔 航向 速度
    NSLog(@"经度:%@,纬度:%@,海拔:%f,航向:%f,行走速度:%f",_longitude,_latitude,currLocation.altitude,currLocation.course,currLocation.speed);
    CLGeocoder *geoCd = [[CLGeocoder alloc] init];//反编码通过经纬度获取具体位置信息。
    [geoCd reverseGeocodeLocation:currLocation completionHandler:^(NSArray *array, NSError *error){
        if (array.count > 0){
            CLPlacemark *placemark = [array objectAtIndex:0];
            //将获得的所有信息显示到label上
            self.location.text = placemark.name;
            //获取城市
            NSString *cty = placemark.locality;
            if (!cty) {
                //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
                cty = placemark.administrativeArea;
            }
            self.city.text = cty;
            NSLog(@"city = %@", cty);
        }
        else if (error == nil && [array count] == 0)
        {
            NSLog(@"No results were returned.");
        }
        else if (error != nil)
        {
            NSLog(@"An error occurred = %@", error);
        }
    }];  
}
@end

仔细看上面的代码,你会发现两个地方都在获取经纬度,你会很诧异吧,

这是因为

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

这个方法在ios6中已经废除变成另一个方法了。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

可以通过locations的下标获取新的定位和上一次的定位信息。

效果如图所示:


点击开始定位按钮,会startUpdatingLocation,由于定位服务是比较费电的,不用的时候要及时关闭定位,也可以获取定位成功后直接调用

stopUpdatingLocation停止定位,也就是在方法(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations中直接停止。



代码下载地点:http://pan.baidu.com/s/1eQuLPIE

有什么问题欢迎指正,大家一起进步啊。

2017-06-05 22:23:58 Merciwen 阅读数 1521

需求和思路

 需求文件
需要重点是这个 结束时间 要展示倒记时。思路是用setTimeout()函数做。

遇到的问题

数据库传过来的日期类型在IOS 不能正确解析

代码

//倒计时函数  一秒钟执行一次
setInterval(daojishi,1000);
//倒计时函数   用each  遍历所有需要处理的时间
function daojishi(){
    $(".truetime").each(function(){
        var end= $(this).html();
        var end_on=formatStr(end);//解决ios手机不兼容问题
        var curtime=new Date();
        var endtime=new Date(end_on);
        var lefttime= parseInt((endtime.getTime()-curtime.getTime())/(1000));
        if (lefttime>0) {
            var day=parseInt(lefttime/(24*60*60));
            var hours=parseInt( (lefttime/(60*60))%24);
            var minutes=parseInt( (lefttime/(60))%60);
            var seconds=parseInt( (lefttime)%60);
            hours  =checkout(hours);
            minutes  =checkout(minutes);
            seconds  =checkout(seconds);
            var title =day+'&nbsp;天&nbsp;'+hours+'&nbsp;小時&nbsp;'+minutes+'&nbsp;分&nbsp;'+seconds+'&nbsp;秒&nbsp;';
        }else{
            var title="时间结束"
        }
        $(this).next('span').html(title);
    });
};  

出现的问题

数据库拿出来的时间是  2016-06-08  这种时间iOS并不兼容 出现未定义的时间格式 所以用下面的函数转一下  成2016/06/08   

解决办法

function formatStr(str) {
    str=str.replace(/-/g,"/");
};

对程序的思考

倒计时中使用了

var curtime=new Date();

这个函数取得是客户端时间 这样做是不妥当的,如果是秒杀等需求大的 不可以这么做。修改本地当前时间 就可以抢到东西!!! 都取系统时间 然后对结果做减法 然而相应的 后台做处理的时间会影响 倒计时的准确性!!所以该怎么做该需要思考!

2016-01-26 21:26:30 software1 阅读数 228

编程题2

/*结合前面的“狗”类,设计一个“人”类
1> 属性

姓名
狗(养了一条狗)
2> 行为

喂狗:每喂一次,狗就会执行“吃”这个行为
遛狗:每溜一次,狗就会执行“跑”这个行为*/

person.h

#ifndef Person_h
#define Person_h

#import <Foundation/Foundation.h>
#import "dog.h"

@interface Person : NSObject
{
@public
    NSString *name;
    Dog *pet_dog;
}
- (void)FeedDog;
- (void)WalkDog;
@end
#endif /* Person_h */

person.m

#import <Foundation/Foundation.h>
#import "dog.h"
#import "person.h"
@implementation Person

- (void)FeedDog
{
    NSLog(@"%@ 喂狗",name);
    [pet_dog Eat];
}

- (void)WalkDog
{
    NSLog(@"%@ 溜狗",name);
    [pet_dog Run];
}
@end

main.m

#import <Foundation/Foundation.h>
#import "dog.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        Dog *dog_st = [Dog new];
        dog_st->color = @"红色";
        dog_st->speed = 5.0f;
        dog_st->sex = @"雌性";
        dog_st->weight = 20.0f;
        Dog *dog_nd = [Dog new];
        dog_nd->color = @"红色";
        dog_nd->speed = 6.0f;
        dog_nd->sex = @"雌性";
        dog_nd->weight = 21.0f;
        [dog_st Eat];
        [dog_st Bark];
        [dog_st Run];
        [dog_st CmpColor:dog_nd];
        [dog_st CmpSpeed:dog_nd];
        Person *person = [Person new];
        person->name = @"希尔薇";
        person->pet_dog = dog_st;
        [person FeedDog];
        [person WalkDog];
    }
    return 0;
}

3

/*设计一个”学生“类
1> 属性

姓名
生日
年龄
身高(单位是m)
体重(单位是kg)
性别
C语言成绩
OC成绩
iOS成绩
2> 行为

跑步:每跑步一次,身高增加1cm,体重减小0.5kg,输出跑完后的体重
吃饭:每吃一次,身高增加1cm,体重增加0.5kg,输出吃完后的体重
学习:每学习一次,3可成绩各加1分,输出学习完后的3科成绩
睡觉:输出所有的属性
比较C语言成绩:跟另外一个学生比较C语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
比较OC成绩:跟另外一个学生比较OC语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
比较iOS成绩:跟另外一个学生比较iOS语言成绩,返回成绩差(自己的成绩 - 其他人的成绩)
计算总分:算出3科成绩的总分
计算平均分:算出3科成绩的平均分*/

student.h

#ifndef student_h
#define student_h
#import <Foundation/Foundation.h>

typedef enum
{
    stu_male = 0,
    stu_female = 1,
    stu_ry = 2,
}STU_SEX;

@interface Student: NSObject
{
@public
    NSString *name;
    NSString *birthday;
    int age;
    float height;
    float weight;
    STU_SEX sex;
    float c_scores;
    float oc_scores;
    float ios_scores;
}

- (void)Run;

-(void)Eat;

-(void)Study;

-(void)Sleep;

-(double)CmpCscores:(Student*) pStu;

-(double)CmpOCscores:(Student*) pStu;

-(double)CmpIOSscores:(Student*) pStu;

@end

#endif /* student_h */

student.m

#import <Foundation/Foundation.h>
#import "student.h"
#import <Foundation/Foundation.h>
@implementation Student
- (void)Run
{
    height += 0.01;
    weight -= 0.5;
    NSLog(@"身高:%g m", height);
    NSLog(@"体重:%g kg",weight);
}

- (void)Eat
{
    height += 0.01;
    weight += 0.5;
    NSLog(@"after eat height :%g", height );
    NSLog(@"after eat weight:%g",weight);
}

-(void)Study
{
    c_scores += 1;
    oc_scores += 1;
    ios_scores += 1;
    NSLog(@"after Study 各科成绩:%f,%f,%f,(顺序c,oc,ios)", c_scores , oc_scores , ios_scores );
}

-(void)Sleep
{
    NSLog(@"姓名:%@",name);
    NSLog(@"生日:%@",birthday);
    NSLog(@"年龄:%d",age);
    NSLog(@"身高:%f m",height);
    NSLog(@"体重:%f kg",weight);
    NSLog(@"性别:%d",sex);
    NSLog(@"C语言成绩:%f", c_scores);
    NSLog(@"OC语言成绩:%f", oc_scores);
    NSLog(@"IOS语言成绩:%f", ios_scores);
}

-(double)CmpCscores:(Student*) pStu;
{
    if(c_scores >= pStu-> c_scores )
    {
        return c_scores - pStu-> c_scores;
    }
    else
    {
        return pStu-> c_scores -c_scores;
    }
}

-(double)CmpOCscores:(Student*) pStu;
{
    if(c_scores >= pStu-> oc_scores )
    {
        return oc_scores - pStu-> oc_scores ;
    }
    else
    {
        return  pStu-> oc_scores - oc_scores ;
    }
}

-(double)CmpIOSscores:(Student*) pStu
{
    if(ios_scores >= pStu-> ios_scores)
    {
        return ios_scores - pStu-> ios_scores;
    }
    else
    {
        return  pStu-> ios_scores - ios_scores;
    }
}

-(double)CalculateTotal
{
    return c_scores+ oc_scores+ ios_scores;
}

-(double)CalculateAvg
{
    double totalscores = [self CalculateTotal];
    return totalscores/3;
}

@end

main.m

#import <Foundation/Foundation.h>
#import "student.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        Student *stu = [Student new];
        stu->name = @"zxx";
        stu->birthday = @"1985-03-23";
        stu->age = 30;
        stu->height = 1.75;
        stu->weight = 160;
        stu->sex = stu_male;
        stu->c_scores = 75.5;
        stu->oc_scores = 90.0;
        stu->ios_scores = 88.0;
        [stu Run];
        [stu Eat];
        [stu Study];
        [stu Sleep];

        Student *stu_cmp = [Student new];
        stu_cmp->name = @"zxx1";
        stu_cmp->birthday = @"1985-03-23";
        stu_cmp->age = 22;
        stu_cmp->height = 1.75;
        stu_cmp->weight = 160;
        stu_cmp->sex = stu_male;
        stu_cmp->c_scores = 73.5;
        stu_cmp->oc_scores = 94.0;
        stu_cmp->ios_scores = 80.0;

        double cmp_cscores=[stu CmpCscores:stu_cmp];
        NSLog(@"cmp_scores=%f",cmp_cscores);

        double cmp_ocscores=[stu CmpOCscores:stu_cmp];
        NSLog(@"cmp_ocscores=%f",cmp_ocscores);

        double cmp_iosscores=[stu CmpIOSscores:stu_cmp];
        NSLog(@"cmp_iosscores=%f",cmp_iosscores);

    }
    return 0;
}

进入day02视频

2019-07-15 17:20:00 weixin_30877181 阅读数 55
当进行操作的时候记录操作时间存在偏好设置当中,当再次点击的时候获取现在的时间然后和之前记录的时间进行比较。如果是一天那么就提示“今天已经操作过了”,如果不是一天,那么可以正常操作,然后记录操作时间。如此循环往复。

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
//    NSLog(@"之前时间:%@", [userDefault objectForKey:@"nowDate"]);//之前存储的时间
//    NSLog(@"现在时间%@",[NSDate date]);//现在的时间
NSDate *now = [NSDate date];
NSDate *agoDate = [userDefault objectForKey:@"nowDate"];
    
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
    
NSString *ageDateString = [dateFormatter stringFromDate:agoDate];
NSString *nowDateString = [dateFormatter stringFromDate:now];
//    NSLog(@"日期比较:之前:%@ 现在:%@",ageDateString,nowDateString);
    
if ([ageDateString isEqualToString:nowDateString]) {
    NSLog(@"一天就显示一次");
 }else{
    // 需要执行的方法写在这里

    NSDate *nowDate = [NSDate date];
    NSUserDefaults *dataUser = [NSUserDefaults standardUserDefaults];
    [dataUser setObject:nowDate forKey:@"nowDate"];
    [dataUser synchronize];
 }

 

转载于:https://www.cnblogs.com/gongyuhonglou/p/11190146.html

学习的第十天

阅读数 188

没有更多推荐了,返回首页