{ "id": "174900", "key": "TIMOB-27867", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [], "resolution": null, "resolutiondate": null, "created": "2020-04-09T19:27:18.000+0000", "priority": null, "labels": [], "versions": [], "issuelinks": [], "assignee": { "name": "amukherjee", "key": "amukherjee", "displayName": "Abir Mukherjee", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2020-06-02T13:47:43.000+0000", "status": { "description": "The issue is open and ready for the assignee to start work on it.", "name": "Open", "id": "1", "statusCategory": { "id": 2, "key": "new", "colorName": "blue-gray", "name": "To Do" } }, "components": [], "description": "FileStream.read() is supposed to be an asynchronous call if invoked with a callback argument. While this works in Android, in iOS it appears to be called synchronously. This is causing our application to feel slow and even hit memory and recursion limits with large files. Attached is a sample app that demonstrates the behavior.\r\n\r\nAndroid 8.1.0 console output \r\n\r\n{code}\r\n[ERROR] \b\b \bstarting file read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b1\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b2\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b3\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b4\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b5\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b6\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b7\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b8\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b9\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b10\r\n[ERROR] \b\b \bDone!\r\n{code}\r\n\r\niOS 12.4 console output\r\n\r\n{code}\r\n[ERROR] \b\b \bstarting file read\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b1\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b2\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b3\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b4\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b5\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b6\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b7\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b8\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b9\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[WARN] \b\b \b ---- 2. Reader Callback\r\n[ERROR] \b\b \b10\r\n[ERROR] \b\b \bDone!\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n[WARN] \b\b \b ++++ 1. After Read\r\n{code}", "attachment": [ { "id": "67329", "filename": "FileStreamAsyncBug.zip", "author": { "name": "ryan@mvretail.com", "key": "ryan@mvretail.com", "displayName": "Ryan Aston", "active": true, "timeZone": "America/Chicago" }, "created": "2020-04-09T19:25:36.000+0000", "size": 8663231, "mimeType": "application/zip" } ], "flagged": false, "summary": "FileStream.read() with a callback is not asynchronous on iOS", "creator": { "name": "ryan@mvretail.com", "key": "ryan@mvretail.com", "displayName": "Ryan Aston", "active": true, "timeZone": "America/Chicago" }, "subtasks": [], "reporter": { "name": "ryan@mvretail.com", "key": "ryan@mvretail.com", "displayName": "Ryan Aston", "active": true, "timeZone": "America/Chicago" }, "environment": "macOS 10.14.6\r\nXcode 10.3\r\nTitanium SDK 8.0.0.GA, 8.3.1.GA, 9.0.0.GA\r\niPhone Xs simulator (iOS 12.4)", "comment": { "comments": [ { "id": "455259", "author": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~ryan@mvretail.com] Was it working in any previous sdk in iOS ?", "updateAuthor": { "name": "vijaysingh", "key": "vijaysingh", "displayName": "Vijay Singh", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2020-04-27T19:05:11.000+0000", "updated": "2020-04-27T19:05:11.000+0000" }, { "id": "455261", "author": { "name": "ryan@mvretail.com", "key": "ryan@mvretail.com", "displayName": "Ryan Aston", "active": true, "timeZone": "America/Chicago" }, "body": "I am not sure. We did not use this API prior to 8.0.0.", "updateAuthor": { "name": "ryan@mvretail.com", "key": "ryan@mvretail.com", "displayName": "Ryan Aston", "active": true, "timeZone": "America/Chicago" }, "created": "2020-04-27T19:08:32.000+0000", "updated": "2020-04-27T19:08:32.000+0000" }, { "id": "455610", "author": { "name": "ryan@mvretail.com", "key": "ryan@mvretail.com", "displayName": "Ryan Aston", "active": true, "timeZone": "America/Chicago" }, "body": "Any updates on this?", "updateAuthor": { "name": "ryan@mvretail.com", "key": "ryan@mvretail.com", "displayName": "Ryan Aston", "active": true, "timeZone": "America/Chicago" }, "created": "2020-06-02T13:47:43.000+0000", "updated": "2020-06-02T13:47:43.000+0000" } ], "maxResults": 4, "total": 4, "startAt": 0 } } }