Pinterest iOS工程师被要求完全重新考虑并重建iOS应用程序-因此他们没有这样做-当然,他们做到了! 这就是每个工程师都想要的。 有机会获得建造的自由。 他们开始关注性能,毕竟,iPhone具有多种处理器的功能。 因此,他们的新应用程序将严重依赖多线程代码。 嗯,你问什么是多线程代码? 我也不知道 因此,我在WIKIPEDIA中进行了查找: “在计算机科学中, 线程代码一词指的是编译器实现技术,其中生成的代码具有一种形式,该形式主要完全由对子例程的调用组成。 该代码可以由解释器处理,也可以只是一系列机器代码调用指令……”,依此类推。 我知道我知道。 如果在WIKIPEDIA中,它是正确的/准确的。 当用户点击时,它可以更好地保持滚动的平滑性和响应性。 听起来并不多,但是在测试中,它们的触摸响应能力(使您的头脑摆脱了混乱)和滚动的平滑度提高了10倍。 此外,他们还通过在AsyncDisplayKit(ASDK)之上构建新框架来加快滚动速度。 这是斯科特·古德森(Scott Goodson)创作的一个开源IOS框架。 当然,如果不对设计进行一些调整,更新将是什么? 根据Pinterest的工程师Garrett Moon的说法,不要害怕,他们通过制作新的动画和过渡来接受挑战。 最大的显着变化在主屏幕上显而易见。 新设计将使用户可以专注于自己的引脚(见下文)。 从iTunes下载该应用程序。
加勒特·月亮| Pinterest工程师,iOS核心体验 一小组Pinterest iOS工程师最近获得了每个工程师梦dream以求的机会-完全重新思考和重建我们的应用程序。 我们发展如此之快,以至于对我们的平台提出了很高的要求。 为了覆盖全球下一个亿的Pinner,我们从头开始重新构建了平台的架构,该框架的内置速度更快,扩展更容易,并且在许多不同的情况下,Pinners的速度提高了3倍。 以下是该项目的一些较大部分,还有更多内容将在未来几周内发布。 出发吧! 表现胜出 要在美国以外的国家/地区吸引更多人,则要求该应用程序性能尽可能出色,尤其是在旧设备上。 这意味着需要解决以前可能出现的问题(例如,滚动家庭供稿时帧丢失)。 减少能耗和提高性能的最快,最简单的方法是利用大多数iPhone具有多个处理器这一事实。 我们的新系统严重依赖多线程代码。 UI渲染,图像下载,GIF解码和模型处理都是我们设计为多线程的系统的所有示例。 这使我们可以更好地保持Pinner轻触时滚动和响应的流畅性。 在测试中,我们测得触摸响应和滚动平滑度提高了10倍。 没有一堆细微的调整,什么绩效项目才能完成? 我们至少构建了三种不同的方法来圆角化视图(在CALayer上使用cornerRadius属性的成本之快令人惊讶地加起来了)。 异步显示 大多数新框架都建立在AsyncDisplayKit(ASDK)之上,AsyncDisplayKit是一个开放源代码iOS框架,最初由Pinterest工程师Scott Goodson编写,可保持UI流畅和响应。 ASDK似乎是解决我们问题的灵丹妙药,因为它提供了UI的异步呈现,因此我们可以完成布局和呈现主线程的昂贵工作。 尽管异步显示是ASDK的主要承诺,但它还提供了一个类似于CSS Box Model的布局系统,可以轻松使用CALayers而不是UIViews(不需要注册触摸时),并且还可以进行其他许多性能改进。 一种特别具有影响力的优化是滚动视图的不同范围的计算。 ASDK将在Pinner的滚动位置之前计算一个单元格范围,该单元格需要从网络中获取其数据,并需要较小范围的单元格以进行预渲染。 这将自动允许及时获取,渲染和清除用户已通过的范围,从而节省了内存和在各个运行循环上花费的时间,从而加快了滚动速度。 当然,在重写几乎整个应用程序以利用ASDK的过程中,我们发现了错误,并向项目提交了许多改进。 实际上,对ASDK的十大贡献者中有五位是Pinterest员工。 不变的数据模型 历史上,另一个重大的痛点是由我们的模型系统引起的。 我们拥有的系统是间歇性线程安全的,并且虽然可以在后台线程上创建模型,但需要对模型进行任何修改才能在主线程上进行。 这对性能不利,并且引入了开发人员并不总是显而易见的复杂性,从而导致许多崩溃。 我们需要的是一个线程安全和高性能的系统。 保证线程安全的最简单方法是使所有内容保持不变,但是要更改近100种模型并在开发新功能时对其进行更新是一个挑战。 为了解决这个问题,我们自己生成了它们。 我们的一位杰出工程师(Rahul Malik)离开了,学到了一些Swift并建立了一个将JSON文件变成不可变模型的系统。 我们对生成器感到非常兴奋,并将很快将其开源并通过博客发布! 现在,我确定您正在问自己:“但是Garrett,如果您的模型是不可变的,如何在您的主板上获得架构图钉?” 我很高兴你问! 我们新的不可变模型允许使用构建器系统创建修改后的副本。 我们有一个强大的框架(由才华横溢的Wendy Lu构建),可以快速安全地将更改通知UI和其他感兴趣的观察者。 我们很快将分享有关模型,生成器和系统的更多信息,以使UI保持同步。 新的设计语言和系统 除了几乎完全重写iOS应用程序之外,我们还承担了全面改革视觉设计的任务。 我们与产品设计团队紧密合作(包括到波特兰远程办公室的实地考察),以实现一种新的设计语言和框架,从而简化了针对多种设备尺寸的构建应用程序的工作。 与设计师一起,我们创建了BRIO的外观(内部设计代号)和要点(即“主体”)以指定设备不可知的布局。 一旦大声说出来,它就不会消失。 新框架还根据屏幕大小和语言自动缩放字体,边距和字距。 我们发现中文,日文和韩文语言对于本机读者来说显得太大了,没有一点扩展,因此我们的框架会自动处理。 总体而言,这是任何工程师都可以落后的系统:适用于任何屏幕尺寸的一种实现方式(好吧,如果IPAD分散存在,还可以##,但至少要少一个数量级)。 没有一些新的交互设计,什么视觉刷新才能完成? […]
Rahul Malik | Pinterest技术主管,iOS核心体验 去年,我们的iOS团队全面改革了整个应用程序的体系结构。 这是一项巨大的努力,导致开发人员可以更快地迭代应用程序,更易于扩展,而全球Pinners的应用程序则快3倍。 我们的新系统严重依赖于并发。 UI渲染,图像下载,GIF解码和网络响应处理只是利用多个线程来提高性能的一些领域。 这意味着这些组件使用的对象必须是线程安全的,以避免错误和潜在的崩溃。 由于模型对象几乎遍历我们应用程序的所有组件,因此确保模型层可以安全地跨线程使用非常重要。 为了解决这个问题,我们转到了一个不变的模型层。 不可变对象与可变对象的不同之处在于,一旦创建它们就无法对其进行修改,这从本质上使它们成为线程安全的。 这使开发人员可以编写更易于推理的代码,因为一旦建立不变量就无法更改。 今天,我们是开放源代码的Plank,这是我们为实现此目的而创建的iOS不可变模型生成器。 Plank是用Swift编写的命令行工具,可生成不可变的Objective-C模型。 在本文中,我们将重点介绍一些主要功能以及其创建的动机。 动机 设计和维护模型层可能很繁琐且容易出错。 缺少简单的null检查或尝试序列化包含无法序列化的属性的对象可能会导致未定义的行为和崩溃。 手写模型还可能遭受其实现中的不一致问题,并且在序列化时可能导致不同的行为和策略。 以下是一些由于手写模型问题导致的常见错误和崩溃的示例。 通过Plank生成模型 让我们用这些字段创建一个表示Pin的模型。 定义架构 Plank将模式文件作为输入,因此我们需要创建一个。 这是Pin类型的架构。 您会注意到我们指定了模型的名称及其属性列表。 请注意,该链接指定了一个附加的format属性,该属性指示Plank使用更具体的类型,例如NSURL或NSDate 。 产生模型 假设此架构另存为pin.json我们通过运行plank pin.json生成模型。 下面,我们将重点介绍Plank从您的模式生成的一些功能。 $木板pin.json Plank创建的Pin类接口 您会注意到的第一件事是所有属性都是readonly 。 这使该类不可变,但是它并没有真正的用处,因为我们没有办法用任何值填充Pin的实例。 为了解决这个问题,我们需要一个抽象,它将采用一组值并产生一个不可变的对象。 变异和建造者 通过生成器类执行Plank生成的模型中的变异。 这是构建器模式的直接实现,Plank会为您生成它。 builder类是一个单独的类型,其中包含readwrite属性和一个将创建新对象的build方法。 JSON解析 现在,我们有了一个不可变的模型和一个构建器类来创建新实例。 但是,大多数应用程序不是静态的,并且依赖于从API返回的JSON数据。 这是我们的Pin模型的示例JSON响应。 为了正确处理此响应,我们不仅需要断言响应类型是正确的,而且还需要添加其他逻辑以将链接表示为NSURL的实例。 小心处理null值也很重要,以避免将属性设置为NSNull值或将null传递给需要nonnull参数的API。 这些错误可能导致无法预测的行为和崩溃。 Plank将创建一个名为initWithModelDictionary的初始化方法,该方法处理解析符合您的模式的NSDictionary对象。 序列化 如果要为应用程序建立脱机支持或在应用程序启动期间保留数据,则需要将模型存储到磁盘。 iOS上最常规的解决方法是在每个模型上实现NSSecureCoding 。 […]
Rahul Malik | iOS平台技术主管 在Pinterest,我们专注于帮助人们发现启发性的想法,从晚餐食谱到尝试,从家庭和时尚产品到购买,再到旅行的地方。 构建最佳的移动产品是其中的关键部分,所有Pinner的80%通过移动应用访问Pinterest。 特别是在iOS团队中,我们一直在不断努力,以尽可能高效和迅速地改善这种体验,而为我们的团队提供最佳的开发和测试环境是其中的关键一步。 最近,我们研究了简化该过程的方法,并着手提高基于本地和持续集成环境的iOS构建的速度和可靠性。 此外,我们开始将应用程序模块化为独立的框架,并需要一个系统来支持该迁移。 我们回顾了多种工具,包括Xcode,Cocoapods,Buck和Bazel。 我们希望为未来引入更稳定的基础,这对于我们快速迭代并向Pinners发布新功能的能力至关重要。 通过比较Xcode,Cocoapods,Buck和Bazel,我们发现Bazel最适合我们的目标,即为性能提高一个数量级,消除构建环境中的可变性并逐步采用该基础。 因此,我们现在使用Bazel交付我们所有的iOS版本,这些版本已经取得了成功,其中包括: 当地发展 更快的构建:将干净的构建时间从4m 38s减少到3m 38s,提高了21%。 本地磁盘缓存允许即时重建您之前构建的任何内容(其他分支,提交等)。 CI和本地环境之间的环境相同,因此生成问题很容易重现。 自动化程度更高:代码生成等任务已包含在构建图中。 持续集成 每个构建都是增量构建:由于Bazel具有可复制性,因此一年多来我们一直没有在CI上执行任何全新构建。 一次构建,可在任何地方重复使用:引入远程构建缓存后,由于我们不需要重新构建任何机器上已构建的任何内容,因此构建时间减少了不到一分钟且低至30秒 缩短着陆时间:将构建时间从10m 24s减少到7m 34s,提高了27%。 缩短更改Beta测试人员的时间:Beta的构建时间从1400万32秒减少到700万52秒,提高了45%。 更快的测试执行:如果修改后的代码不影响测试,则测试运行是即时的。 更高的构建成功率:使用Bazel运行构建任务时,构建成功率从大约80%提高到97%-100%。 迈向快速可靠构建的未来 由于我们使用的是编译语言(Objective-C / C ++),因此构建速度一直是开发人员的瓶颈。 但是构建速度很难量化。 它包括在不同环境中的构建,例如持续集成或本地开发。 我们还处理各种工作流程方案,例如全新构建,增量构建,分支切换,变基,还原更改等。 您无法改善无法衡量的内容,因此,提高构建速度需要跟踪各种方案,以使我们能够准确地确定回归并集中精力进行性能工作。 我们可以通过减少工作量或提高工作效率来加快构建速度。 这可能涉及使用不同的工具,改善并行化或更新项目的体系结构以需要更少的源文件。 围绕维护模块化体系结构以及清除未引用的代码或与已完成的实验相关的无效代码,采取有力的实践将有助于维护/提高构建速度。 我们使用各种内部工具和脚本来识别无效代码。 对于实验,我们利用自动化功能添加了clang批注以弃用与实验相关的方法和常量,从而允许编译器警告开发人员实验已结束且应删除代码。 开发人员通过定期运行工具来检查未引用的代码,即定期运行工具来检查标头包含我们构建的图形,并递归查找零引用的文件。 我们的构建过程必须既快速又可靠。 如果构建是可复制的,则它们是可靠的。 可重现的构建不仅对于重现错误很重要,而且对于确保我们提供经过开发和测试的应用程序的确切版本也很重要。 只有构建环境(输入和输出)一致,我们才能实现这一目标。 环境的变化会极大地影响最终产品并引入可变性。 一致的环境可确保应用程序的行为相同,而不管它是在开发人员的计算机上构建还是通过持续集成构建而成,并且消除了花时间弄清楚构建为何在一个环境中成功而在其他环境中失败的时间。 尽管这些想法和探索都围绕iOS进行,但快速且可复制的构建目标是我们所有人共同的目标,并将使我们能够扩展客户端工程。 挑战性 专注于改善构建过程的决定植根于它对开发人员生产力的影响。 随着我们团队和产品的增长,投资于开发人员使用一致且快速的构建系统的能力至关重要。 规模:随着我们扩展客户工程的规模,花费在支持开发人员,维护或减少构建时间以及提高可靠性规模上的时间也有所增加。 […]
我能够上传在网上的照片到这个代码pinterest NSURL *sourceURL = [NSURL URLWithString:@"http://placekitten.com"]; [pinterest createPinWithImageURL:imageURL sourceURL:sourceURL description:@"Pinning Demo"]; 但我无法find一种方法来上传本地图片Pinterst.I不想把我的本地图像在服务器上只是想本地pinterst,如果有什么方法,请帮助
我一直在整个周末一直在xcode的观点挣扎,但仍然不能如我所愿。 我想做一个Pinterest的detailview(见下面的链接),但无法find如何做到这一点,它是一个tableview自定义单元格,collectionview或其他什么东西..哪种方法是最简单的方法来构build它? 如果有人为我提供了一些好的投入,我会很感激的。 有一个伟大的未来一周! Pinterest的DeatilView 编辑:这是我现在得到的..但感觉应该有一个更简单的方法.. #import "ViewController.h" enum TableSectionSelected { kUIMainContentSection = 0, kUISecondSection, kUIActivateSection }; @interface ViewController () <UITableViewDelegate, UITableViewDataSource> @property (nonatomic, strong) UIImageView *imageView; @end @implementation ViewController – (void)viewDidLoad { [super viewDidLoad]; self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; self.imageView.image = [UIImage imageNamed:@"fotolia_54424692.jpg"]; } – (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 3; } […]
似乎有一个字典值,我可以放在GET调用对应的PDKPin属性,我可以调用我的成功块解压值,即“url”= PDKPin.url“note”= PDKPin.decriptionText ,但是我无法find一个相应的属性“链接”,这是可用的每个文档https://developers.pinterest.com/docs/api/pins/ ? PDKClient.sharedInstance().getAuthenticatedUserPinsWithFields(Set(["url", "note", "link"]), success: { (responseObject :PDKResponseObject!) -> Void in print("success /(pdk)") let currentResponseObject = responseObject let pins = currentResponseObject.pins self.pinArray = pins() for pin in self.pinArray { if let pinAsPDKPin = pin as? PDKPin { print(pinAsPDKPin.descriptionText) if let safeURL = pinAsPDKPin.url { print(safeURL) } let link = pinAsPDKPin.link //no […]
嗨我想find一种方式来发布/上传本地生成的图像pinterest与iOS SDK。 我正在做与UIWebView的pinterest集成,因为没有公共的API,并尝试使用的图像url fileURLWithPath:显然没有成功。 有没有人有任何想法,如果这可以完成? 最有趣的应用程序显然允许您上传/ pin从相机胶卷的图像。 有没有什么方法在我的应用程序中embedded这种function? 谢谢!
我不能在我的生活中find如何通过HTML内的锚来简单地打开Pinterest板(通过启动应用程序,如果安装的话)。 我看了一下: https : //developers.pinterest.com ,但仍然找不到我在找什么。 看起来大部分文档都是针对一个项目而不是观看的。 我想要做的就是打开一个用户configuration文件。 例如,我已经挖掘了以下可用于其他社交媒体链接的以下内容: <a href="fb://profile/23050834961">Facebook</a> <a href="twitter://user?screen_name=NHLBruins">Twitter</a> <a href="instagram://user?username=nhlbruins">Instagram</a> 虽然我可以启动Pinterest应用程序,但我不确定参数将在Pinterest上打开特定的configuration文件/主板: <a href="pinterest://">Pinterest</a> 感谢: http : //handleopenurl.com/上面的帮助,但似乎没有Pinterest的。 任何线索?
我正在开发一个应用程序,希望在Pinterest上分享video。 我search所以我发现的形象 https://pinterest-ota-builds.s3.amazonaws.com/PinItDemo.zip http://developers.pinterest.com/ios/ 我下载框架,框架工作只有一个文件可用 Pinterest.h @interface Pinterest : NSObject – (id)initWithClientId:(NSString *)clientId; – (id)initWithClientId:(NSString *)clientId urlSchemeSuffix:(NSString *)suffix; – (BOOL)canPinWithSDK; – (void)createPinWithImageURL:(NSURL *)imageURL sourceURL:(NSURL *)sourceURL description:(NSString *)descriptionText; + (UIButton *)pinItButton; @end 没有任何types的login和authentication方法,没有任何types的video共享方法。 我也发现这个iOS Pin Pin SDK没有文档和示例代码 我也使用这个使用UIWebView和它在ImageUrl工作正常,而不是video或没有url。 – (NSString*) generatePinterestHTML { NSString *description = @"Post your description here"; NSString *sUrl = [NSString stringWithFormat:@"http://www.alkalima.com/images/08-02/nature.jpg"]; NSLog(@"URL:%@", sUrl); […]