我认为部分问题是因为Swift 4改变了诸如@objc工作之类的方式。
有很多教程,具有很多不同的值,而且我无法在使用哪个版本的版本之间做出选择,以弄清楚如何使其在该版本中工作。
let delegate = UIApplication.shared.delegate as! AppDelegate
delegate.addObserver(self, forKeyPath: #keyPath(AppDelegate.session), options: [], context: nil)
// Warning: Argument of #keyPath refers to non-'@objc' property 'session'
Run Code Online (Sandbox Code Playgroud)
添加@objc到var声明只是告诉我,无法在Objective-C中引用APISession。这似乎导致要求我将要使用此工具的每个类/变量公开给Obj-C的方法,而且似乎倒退了-据我了解,这是一个较新的功能,这很奇怪苹果不会让它在Swift中原生运行。对我来说,这表明我在某种程度上误解或误用了某些东西。
我正在将一个对权限敏感的应用程序迁移到 ActiveStorage。我需要确保文件只能由具有权限的人访问,并且这些权限仅持续指定的时间段。
使用 Paperclip,这就像使用专家授权调用定义路线一样简单:
def thumbnail
authorize @record
redirect_to @record.thumbnail.expiring_url(300)
end
Run Code Online (Sandbox Code Playgroud)
任何调用都/record/thumbnail将由 devise 进行身份验证,由 pundit 授权,然后使用过期的 URL 重定向到 S3。这是一个有效的过程。
转向 ActiveStorage,我最初的想法是我会使用service_url,但它仅在我使用 S3 时才有效 - 它在测试中不起作用,如果我在使用磁盘服务进行本地开发时它不起作用。实际的“正确”方法是使用url_for, 或 在上面的示例中redirect_to url_for @record.thumbnail。
问题是,url_for似乎发出了一个永久 url——它生成的 url 对任何人来说始终有效,无需身份验证或授权。更重要的是,一旦有人拥有了那个网址,我就无法撤销它,我不能说它只有效一周。一旦某人拥有该 URL,他们就可以永远访问该文件。(或者,大概,至少在文件更新之前)。
我不认为这是一个巨大的安全缺陷,但这绝对是使用 Paperclip 所能实现的目标的倒退。我是否遗漏了一个重要的细节,或者这真的是 ActiveStorage 所能做到的一切吗?
我正在尝试编写一个SQL查询,它将根据其他几个表中的数据在一个表中收集某些数据.那部分很容易.不幸的是,我还需要从第二个表中恢复数据,这需要使用左连接来完成.
如果我只是做左连接,例如
select *
from table_A A
left join table_B B on A.id=B.id
Run Code Online (Sandbox Code Playgroud)
一切都好.我可以足够安全地添加where子句,比如
where A.id>5
Run Code Online (Sandbox Code Playgroud)
例如,当我尝试在左侧有多个表时,会出现问题
select *
from table_A, table_C
left join table_B on A.id=B.id
where table_A.id=table_C.id
Run Code Online (Sandbox Code Playgroud)
突然之间,A.id不再是公认的专栏.我尝试更改它,以便我选择A.id作为foo,然后选择foo = B.id,但foo也不被识别.('on子句'中的未知列'bla')
虽然有许多引用,但解释如何进行连接子句,并且一些示例甚至使用简单的where子句,我找不到任何组合连接子句,where子句和左侧的多个表.
有关问题的背景:
我的原始查询是:
select SQL_CALC_FOUND_ROWS tutor_user.username
, tutor_user.userid
, tutor_tutor.rate
, tutor_user.username
from tutor_user
, tutor_attends
, tutor_tutors_in
, tutor_subject
, tutor_tutor
where tutor_user.userid=tutor_attends.userid
and tutor_attends.schoolid=80
and tutor_tutors_in.userid=tutor_user.userid
and tutor_tutors_in.subjectid=tutor_subject.subjectID
and tutor_subject.name='Aerospace Studies'
and tutor_tutor.userid=tutor_user.userid //ERROR
LIMIT 0, 15
Run Code Online (Sandbox Code Playgroud)
遗憾的是,无法保证每个用户都会存在tutor_tutor信息 - 这是在网站/数据库设计周期早期不良决策中存在的一个小缺陷.因此,简单的解决方案是将其转换为连接.
问题是,我找不到任何好的教程解释如何将连接与where子句结合起来.我尽最大努力提出以下建议:
select SQL_CALC_FOUND_ROWS tutor_user.username
, tutor_user.userid …Run Code Online (Sandbox Code Playgroud) 如果我在.h文件中定义一个具有一个参数名称的函数,这是否重要,例如......
-(foo *) initWithId:(NSString *)id;
Run Code Online (Sandbox Code Playgroud)
然后在我的实现中为参数赋予一个不同的名称,因为它隐藏了一个类属性:
-(foo *) initWithID:(NSString *)idString;
Run Code Online (Sandbox Code Playgroud)
我知道自动完成文件使用.h作为其自动完成填充程序的"基础",虽然它不适用于这种情况,但我更喜欢在我的函数中使用属性名称以尽可能保持我的编码风格.理解getFoo和setFoo都适用于 - (bar*)initWithFoo:(id)foo;中的同一属性'foo'更有意义.
据我所知,编译器没有任何问题,但不知怎的,似乎它应该是重要的.
XCode给了我一个非常无益的错误,即不允许重新实现一个类.我搜索并搜索了,其他地方没有实现类名 - 引用但未实现.
我实际上做了一个关键字搜索,并浏览了我的项目中引用该类的每一行,并没有找到任何试图实现它的东西.(并且,令人讨厌的是,网上没有什么可以帮助解决这个特定的错误 - 因此我为什么要包括自我答案,以帮助下一个人发生这种情况).
我的智慧结束了.我正在尝试调试崩溃,最后我设法跟踪它.我的'minutesLeft'变量以某种方式被释放.
问题是,我从未将其设置为释放,并且属性设置为保留.我无法弄清楚发生了什么!
使用zombie变量,我得到以下消息:*** - [CFNumber intValue]:发送到解除分配的实例0x728fdd0的消息
并将其跟踪到以下代码行:
NSLog(@"MeterViewController minutesLeft %i", [minutesLeft intValue]);
Run Code Online (Sandbox Code Playgroud)
问题是当我声明属性... @property(nonatomic,retain)NSNumber*minutesLeft; 所以该物业应该为我处理保留!
使用...设置该值
minutesLeft=[NSNumber numberWithInt:row];
Run Code Online (Sandbox Code Playgroud)
和...
minutesLeft=[NSNumber numberWithInt:(((timeLeft)/60)%60)];
Run Code Online (Sandbox Code Playgroud)
对于dealloc和viewDidUnload,我有
self.minutesLeft=nil;
Run Code Online (Sandbox Code Playgroud)
但既然我不离开这个观点,那些不应该影响任何东西.
有人有主意吗?
我正在开发一个专门用于分享故事的网站,这是我学习Ruby on Rails的一部分.我已经设法完成了很多步骤,但我仍然坚持如何在模型的两个属性中创建唯一约束.
我能够创建一个数据库级唯一性约束,这应该有帮助,但'rails方式'说我需要在模型中创建它,数据库约束只是在并行问题的情况下备份(经典'用户双击按钮'方案).
我的问题可以被认为等同于创建第二个主键,它恰好是对象中两个变量的组合.也就是说,我实际上并不想取代'自然'复合键,实际上对将它留在原地非常满意.在大多数情况下,我更喜欢使用唯一ID来标识表中的每个对象.
也就是说,出于这个应用程序的目的,我需要一种方法来跨两列定义唯一性约束.故事可以重复,章节号可以重复,但是你永远不能复制给定故事的给定章节号.一个故事可以只有一个章节.当然,仅仅因为它的编号为1并不意味着它的标题第一章; 它可能是序幕.或者第零章.管他呢.这个数字仅用于(或者,一旦我到达那里),以帮助创建一个"干净"的网址.我不介意storyID相当高,或者对于给定的一组故事而言,它们具有非顺序ID.没关系.但是我认为,当他从故事的第一章到第二章时,从故事/ 1 /章/ 32到故事/ 1 /章512,看到网址是令人困惑的.
我试过这个:
validates [:story_id, :number], uniqueness:true
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - 它不能从数组中生成符号.所以我不知道该怎么做.
我最初假设我的问题的答案是简单的“是”,但我从那以后所做的一些阅读让我再次审视了这个问题。
我的意图是使用模块化代码,这让我可以从许多代码部分中进行挑选,以向应用程序添加各种功能。例如,我可能有一个允许安全浏览的浏览器组件,一个用于进行用户调查的调查组件,以及一个作为应用程序主要目的的“核心”组件——无论是显示菜单还是显示地图的一个位置。
我希望每个独立的模块都有自己的 CoreData 堆栈。它们不会以任何方式相互交谈或干扰,除了应用程序本身所介导的任何内容(使用委托模型与应用程序进行通信)。浏览器的书签和白名单站点列表与调查的调查数据列表是分开的,它也与应用程序的“核心”所做的任何事情完全分开。如果他们需要互相交谈,他们可以通过委托调用来实现,其中包括告诉应用程序“我需要一个浏览器来显示 X 页”、“使用此 ID 显示调查”,或者最后“我是完成,返回主应用程序”。
让我开始走这条路的是意识到没有办法确定给定的 NSManagedObjectContextDidSaveNotification 是否属于给定的核心数据堆栈。而且,据推测,在 mergeChangesFromContextDidSaveNotification: 方法中向 MOC 提供来自不同核心数据堆栈的通知将是一个坏主意。(我也担心当您尝试将 MOC 自己的通知反馈回其中时会发生什么,但我可以轻松地尝试这种情况)
所以我正在进行对话,而且我想到了什么 - 什么是'富'API?什么是'差'API?这是一个经常被抛出的术语,几乎感觉它可能是营销演讲,我想知道它是否真的具有某种程序性意义,如"RESTful API".
ios ×3
objective-c ×3
xcode ×2
core-data ×1
definition ×1
iphone ×1
mysql ×1
ruby ×1
sql ×1
swift ×1
swift4 ×1
terminology ×1