小编Joh*_*ohn的帖子

在C中奇怪使用花括号

很抱歉这个简单的问题,但我正在度假阅读一本关于核心音频的书,并没有我的C或Objective C书籍...

这个变量定义中的花括号是什么?

MyRecorder recorder = {0};
Run Code Online (Sandbox Code Playgroud)

c structure initialization objective-c

29
推荐指数
4
解决办法
2142
查看次数

iOS是在主线程上执行的委托和观察者调用的方法吗?

对不起,我不确定这里是否使用正确的语言,但是当调用方法因为它们是委托方法,或者因为被列为观察者目标而调用的方法时,它们是否在主线程上执行?

我想知道我是否可以在这些方法中进行UI更改,或者我是否必须将它们包装起来

    dispatch_async(dispatch_get_main_queue(), ^{ UI stuff });
Run Code Online (Sandbox Code Playgroud)

TIA:约翰

multithreading ios

14
推荐指数
2
解决办法
6100
查看次数

iOS - 如何在后台完成漫长的过程

我的应用将视频上传到Facebook.即使不耐烦的用户在上传过程中点击"主页"按钮,我也希望在后台完成上传.

经过一番阅读,我试过这个:

     UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
         [[UIApplication sharedApplication] endBackgroundTask:bti];
     }];

     [fb requestWithGraphPath:@"me/videos"
                    andParams:params
                andHttpMethod:@"POST"
                  andDelegate:self];

     [[UIApplication sharedApplication] endBackgroundTask:bti]; 
Run Code Online (Sandbox Code Playgroud)

这项工作是用fb请求方法完成的.视频通过http连接上传到Facebook.这样可以正常工作,但如果您在上传过程中通过单击"主页"按钮来设置应用程序,则会暂停上载.如果您预览应用程序,则会继续上传.

我希望会发生的是上传将在后台完成.

有什么希望让它工作?我是否在整个beginBackgroundTask中做错了什么?以这种方式工作似乎太简单了,但这就是文档似乎所说的.

任何帮助,非常感谢.

- 约翰

cocoa-touch objective-c facebook-graph-api ios

9
推荐指数
2
解决办法
6169
查看次数

禁用整个UIView

我的应用需要将图像保存到磁盘.我在一个单独的线程中执行此操作,因此UI仍然响应,但是,我不希望用户添加新图像,直到第一个保存(大约1秒).

目前,我正在禁用"拍摄另一张照片"按钮并将其灰显,但我想知道是否有一种方法可以禁用整个视图,使按钮变灰并使背景变暗,就像发生的情况一样提出了一份UIActionSheet.

我查看了UIView文档并且没有看到这样的内容,但它看起来像苹果经常使用的这种有用的模式,我想我会问,以防万一有这样的事情.

显然我可以手动完成,但如果它已经是API的一部分,为什么要重新发明轮子.

TIA:约翰

uiview ios

8
推荐指数
2
解决办法
9736
查看次数

基于客户端的网站的最佳数据库策略(Ruby on Rails)

我已经建立了一个很好的网站系统,以满足小型利基市场的需求.去年我通过使用Capistrano将软件副本部署到我的网络服务器来销售这些网站.

在我看来,这些网站的唯一区别是数据库,CSS文件以及用于单个客户端图形设计的一小组图像.

其他一切都完全一样,或者应该是......现在我已经部署了大约20个这样的站点,用相同的代码保持它们全部更新变得很麻烦.这个问题只会变得更糟.

我想我应该重构这个系统,这样我就可以使用一组部署的ruby代码,通过传入请求的URL动态选择正确的数据库等.

似乎有两种处理数据库的方法:

  • 使用多个数据库,每个客户端一个
  • 使用一个数据库,每个表中有一个client_id字段,以及一个额外的"客户"表

多数据库方法对我来说是最简单的,因为我不必重构应用程序中的每个模型来将client_id字段添加到所有CRUD操作中.

但是,每次我想要迁移数据库时,必须为数十个或数百个不同的数据库运行"rake db:migrate"是一件麻烦事.显然这可以通过脚本完成,但它闻起来不太好.

另一方面,每个客户在'items'表中将有20K-50K项目.当items表中有五十万或几百万个项目时,我担心全文搜索的速度.即使在client_id字段上有索引,我怀疑如果将项目分成不同的客户端数据库,搜索会更快.

如果有人对解决这个问题的最佳方法有了明智的意见,我非常希望听到它.非常感谢...

- 约翰

ruby database activerecord ruby-on-rails

5
推荐指数
1
解决办法
1937
查看次数

有人可以解释源时间,电影时间,演示时间等吗?

在我的iOS应用中,我需要将图像保存为短视频片段.我有这个工作使用AVAssetWriter和AVAssetWriterPixelBufferAdaptor,感谢这个网站上的一些很棒的帖子,但我不得不捏造开始和结束会话时间,以及演示时间,因为我真的不了解它们.

以下片段创建了一个2秒的视频,但我通过反复试验设置了不同的时间.老实说,我不确定为什么它不能制作3秒的视频.

// start session
videoWriter.movieFragmentInterval = CMTimeMake(1,600);
[videoWriter startWriting];
CMTime startTime = CMTimeMake(0, 600);
[videoWriter startSessionAtSourceTime:startTime];

while (1) {
    if (![writerInput isReadyForMoreMediaData]) {
        NSLog(@"Not ready for data");
    } else {
        [avAdaptor appendPixelBuffer:pixelBuffer 
                withPresentationTime:CMTimeMake(1200,600)];
        break;
    }
}

//Finish the session:
[writerInput markAsFinished];
CMTime endTime = CMTimeMake(1800, 600);
[videoWriter endSessionAtSourceTime:endTime];
[videoWriter finishWriting];
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这个片段中的各种时间设置,或者指向一个有用的文档吗?我读过苹果文档,直到我睁大眼睛,但我猜它们比我现在拥有更多的知识.

TIA:约翰

avfoundation ios avassetwriter

5
推荐指数
0
解决办法
863
查看次数

iOS 5 + ARC - 确定指针释放内存的nil?

我正在努力遵守Apple关于在我的应用中响应低内存警告的指导原则.指南说:"收到(低内存警告)后,您的应用程序必须释放尽可能多的内存,方法是释放不需要的对象,或者清除以后可以重新创建的内存缓存."

问题是,如何使用ARC"释放"内存?

例如,假设我在视图的视图层次结构中有一个不在屏幕上的图像.在didReceiveMemoryWarning中,我目前通过调用removeFromSuperview将其从视图中删除,但我仍然有一个指向UIImage本身的指针.我还应该尝试释放这段记忆吗?怎么样?通过为指针指定nil?

TIA:约翰

memory-management ios automatic-ref-counting

5
推荐指数
1
解决办法
4768
查看次数

为什么我的AVURLAsset没有持续时间?

在我的iOS应用程序(SDK 5.6)中,我从短视频创建AVURLAsset,如下所示:

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.如果我在gdb中检查资产,它看起来像这样:

(gdb) po asset
<AVURLAsset: 0x1a1c40, URL = file://localhost/var/mobile/Applications/A2142D8E-BC19-4E0B-A4C8-ABED4F7D4970/Documents/sample_iTunes.mov>
Run Code Online (Sandbox Code Playgroud)

我使用Apple网站上的示例.mov文件,该文件存储在应用程序的Documents目录中.

我想知道这段视频的持续时间,以便进一步处理,但是当我检查持续时间属性时,我得到了这个:

(gdb) po asset.duration
There is no member named duration.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?有没有其他方法来确定AVAsset或AVAssetTrack的持续时间?

TIA:约翰

avfoundation ios

3
推荐指数
1
解决办法
3924
查看次数

iOS:如何获取指向导航控制器的指针

我显然错过了一些东西......

在我的iOS应用程序中,我将UIViewController推送到导航控制器:

MyViewController *mvc = [[MyViewController alloc] initWithNibName:@"MyViewController"];
[self.navigationController mvc animated:YES];
Run Code Online (Sandbox Code Playgroud)

MyViewController显示正常,我可以看到并使用navigationBar,但当我尝试从视图控制器中获取指针返回导航控制器时,我得到一个零结果.

UINavigationController *nav = [self navigationController];
if (!nav) {
    NSLog(@"no nav");
}
Run Code Online (Sandbox Code Playgroud)

我整天都在反对这一点,但却看不出我做错了什么.我在Xcode中没有任何警告或错误.我完全错过了什么吗?

TIA:约翰

uinavigationcontroller ios

3
推荐指数
1
解决办法
8948
查看次数

如何像'2013-05-11 00:00:00'一样创建NSDate

我想这是一个非常基本的问题,但我似乎无法在我的任何一本书中找到答案.

假设我有一个日期,创建如下:

NSDate *today = [NSDate date];
Run Code Online (Sandbox Code Playgroud)

但是我想把'今天'的时间部分改为'00:00:00'.我怎样才能做到这一点?

- - 添加 - -

我试过这个:

    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:11];
    [components setMonth:5]; 
    [components setYear:2013];
    [components setHour:0];
    [components setMinute:0];
    [components setSecond:0];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *startDate = [calendar dateFromComponents:components];
    NSLog(@"Current date: %@", startDate);
Run Code Online (Sandbox Code Playgroud)

但NSLog打印出来:

Current date: 2013-05-11 04:00:00 +0000
Run Code Online (Sandbox Code Playgroud)

我猜这与我的纽约时区有关?

- 答案 -

以下是寻找它的人的答案.消除04:00:00时间的技巧是将时区设置为GMT:

[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
Run Code Online (Sandbox Code Playgroud)

- 修订答案 -

但实际上您可能想要本地时间 - 例如,如果您需要按日期在核心数据中查找记录,并且存储的日期是当地时间 - 那么您可能不希望将时区设置为GMT,毕竟.

ios

-1
推荐指数
1
解决办法
1669
查看次数